Note: info is outdated. At this moment we use PinoJS and couldn't be happier. PinoJS is basically a better (cleaned and tuned) version of Bunyan logger used by NodeJS team.
The abscence of feature is not automatically BAD just and the presence is not automatically GOOD.
Debug | Log4Js | Winston | |
---|---|---|---|
Levels | 1 | 5 | 6 |
Custom Levels | - | + | + |
Level Filter | - | + | + |
Custom Loggers | + | + | + |
Logger Filter | + | + | + |
Formats | - | + | + |
Custom Formats | - | + | + |
Transports | console | console, file, SMTP | console, file, SMTP |
Custom Transports | - | + | + |
File Rotation | - | + | + |
JSON support | no | no | yes |
Specifics | profiling logger wildcards |
... | profiling querying(!) |
https://npmcompare.com/compare/debug,log4js,winston
Initially I felt like Log4JS has better defaults so decided to stick with it. Then I've found a significant drawback: Log4JS wants you to attach transports (called appenders there) to categories rather than loggers themselves. So you cannot define levels per transports per loggers.
I may be wrong, but I belive this (basic) case is not possible to configure with Log4JS:
WINSTON
mainLogger
transports
console
DEBUG
file
INFO
SMTP
ERROR
Winston also understands exceptions so
try {
throw Error("bad")
} catch (err) {
logger.error(err)
}
logs valid JSON (note \n
) (plain text is also configurable).
{"message":"bad","stack":"Error: bad\n at Object.<anonymous> (/.../test/winston.js:14:8)\n at Module._compile (module.js:573:32)\n at Object.Module._extensions..js (module.js:582:10)\n at Module.load (module.js:490:32)\n at tryModuleLoad (module.js:449:12)\n at Function.Module._load (module.js:441:3)\n at Module.runMain (module.js:607:10)\n at run (bootstrap_node.js:382:7)\n at startup (bootstrap_node.js:137:9)\n at bootstrap_node.js:497:3","level":"error","timestamp":"2016-11-07T09:28:41.799Z"}
Usage experience: Winston is hands down better than Log4JS in almost all aspects.