winston-sugar is a syntactical sugar on top of winston, winston-sugar makes your winston configurations more easy by using a single .json configurations file.
Installation
Use npm command - npm i winston-sugar
winston-sugar will create a folder name config
if not exist and generate winston.json
file template, this .json file will me the single point of all of your configurations.
How to use it?
- Edit your json configurations file template.
- Require
winston-sugar
to get a classWinstonLoader
instance. - Load your
winston.Logger' configurations by passing the .json path to the
config` function. - Get your
winston.Logger' instance by calling
getLogger()function, you can add
category` as string parameter if you need to have a child logger for a specific module.
note: you need to call config
only one time from the entry point of your application.
- After that your can only do like this:
const logger = require('winston-sugar').getLogger('app');
example:
// Import winson-sugar when you need to have a winston instance const winstonLoader = require('winston-sugar'); // This should be called in the application entry point only. winstonLoader.config('../config/winston.json'); // Get winston logger const log = winstonLoader.getLogger('app'); // Enjoy and log using winston log.info("It's me winson-sugar :) ");
Dependances
Build your .json winston configurations file
The .json configuration schema has 7 main parameters:
- level - (optional) Including the main logging level value (info,debug,warn ...etc.).
ex. "level": "info"
- Also it's the default value in winston-sugar
- levels - (optional) Including 2 child parameters (values & colors) if you need to customize your levels along with colors.
ex. Customize logger levels and it's clolors "levels":{ "values": { "trace": 6, "debug": 5, "info": 4, "warn": 3, "error": 2, "fatal": 1, "mark": 0 }, "colors": { "trace": "blue", "debug": "cyan", "info": "green", "warn": "yellow", "error": "red", "fatal": "magenta", "mark": "grey" } }
- silent - (optional) Use
silent
if you need to stop the winston logger by change it's value totrue
ex. "silent": false
- Also it's the default value in winston-sugar
- exitOnError - (optional) Use
exitOnError
if you need to stop the winston when error occurred by change it's value totrue
"exitOnError": false
- Also it's the default value in winston-sugar
- format - (mandatory) Array of
winston.format
functions, just put the exact function name without (), also you can add it's options as the following example. (please checkwinston.format
from winston format section).
Extra Feature: Specially for winston.printf
format function, I created a special syntax using templates, template is a callback function defined as string parameter, this function will be passed to winston.printf
function in the runtime.
ex. Adding two winston.format functions, winston-sugar will combine all format functions on behalf of you :) "format": [ { "type": "timestamp", "options": { "format": "YYYY-MM-DDThh:mm:ss.SSS" } }, { "type": "printf", "options": { "template": "custom" // the name of the custom template. } } ]
- transports - (mandatory) Array of
winston.transports
functions, just put the exact transport name, also you can add it's options as the following example. (please checkwinston.transports
from winston transports section).
Extra Feature:
Now you can restrict your transport for a specific levels using filters
, I created a special syntax using templates, let's say you have 2 winston.transports.File
you can configure the first to log info
messages only, and the last for error
and fatal
.
Also using the new introduced env
parameter, you can easily configure each transport to be run only for a specific environment. for this option winston-sugar
will read define the application running environment from NODE_ENV
global parameter.
ex. Adding 3 types of transports, one is type of Console for development, and the rest of type File for production. "transports": [ { "type": "Console", "name": "dev-logger", "env": "development", "options": { "stderrLevels ": [ "fatal", "error" ], "consoleWarnLevels": [ "debug", "warn" ], "handleExceptions": true, "format": [ // Override the deafult logging format. { "type": "printf", "options": { "template": "custom-colored" // the name of the custom template. } } ] } }, { "type": "File", "name": "info-logger", "env": "production", "options": { "filename": "log/app.log", "maxsize": "100m", "maxFiles": 3, "tailable": true, "maxRetries": 3, "zippedArchive": true, "handleExceptions": true, "filters": [ // Override the logging level. "info", // log level info and mark only. "mark" ] } }, { "type": "File", "name": "error-logger", "env": "production", "options": { "filename": "log/fatal.log", "maxsize": "100m", "maxFiles": 3, "tailable": true, "maxRetries": 3, "zippedArchive": true, "handleExceptions": true, "filters": [ // Override the logging level. "error", // log level error and fatal only. "fatal" ] } } ]
- printf - (mandatory) Only if you are using
printf
as a type ofwinston.format
function, you can easy defined you logging template as callback function.
Warning: Check the syntax of your callback function before converting it to a string format. wrong syntax will throw an error
in the runtime.
ex. Three callback funcation templates "printf": { "templates": { "custom": "(({level, message, category, timestamp})=> { return `[${timestamp}] [${level}] ${(category)?category:'winston'} - ${message}`;})", "custom-colored": "(({level, message, category, timestamp})=> { return winston.format.colorize({all:true}).colorize(level,`[${timestamp}] [${level.toUpperCase()}] ${(category)?category:'winston'}`) + ` - ${message}`;})", "custom-all": "((info) => {let message = `${new Date(Date.now()).toUTCString()} | ${info.level.toUpperCase()} | ${info.message} | `; message = info.obj ? message + `data:${JSON.stringify(info.obj)} | ` : message; message = this.log_data ? message + `log_data:${JSON.stringify(this.log_data)} | ` : message; return message;})" } }
Configurations .json file template
- Once you installed
winston-sugar
check thewinston.json
file underconfig
directory, and change it based on your needs.
Licenses
MIT License
Copyright (c) 2020 Mohamed El Sayad
Top comments (0)