winston-sugar
Version:
Syntactical sugar on to of winston, configure winston will be easy using .json configuration file
213 lines (166 loc) • 7.45 kB
Markdown
# **winston-sugar**
<img alt="npm" src="https://img.shields.io/npm/v/winston-sugar">
<img alt="NPM" src="https://img.shields.io/npm/l/winston-sugar">
Syntactical sugar on top of `winston`, configuring winston will be easy using .json configuration file.
Special thanks to all of `winston` team for the great logger.
**Installation**
Use **npm** command - `npm i winston-sugar`
`winston-sugar` will create a folder name `config` if not exist and add `winston.json` file template.
**How to use it?**
- Build your .json configurations file (rich example here-under).
- Require `winston-sugar` to get a class `WinstonLoader` instance.
- Load your winston logger configurations by passing the .json path to the `config` function.
- Get your winston logger 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**
winston@3.2.1
**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 to `true`
`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 to `true`
`"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 check `winston.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 check `winston.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 of `winston.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**
- Please check the `winston.json` under `config` directory.
**Licenses**
MIT License
Copyright (c) 2020 Mohamed El Sayad (Anubis)