是否可以将winston日志记录和调试模块一起使用



我使用winston日志记录,因为我使用它的功能,如不同的日志记录级别、多个传输等。

但我也喜欢debug的命名空间功能。此外,express已经使用了它。那么,是否可以将它们一起使用,例如让winston日志记录具有名称空间?

在使用了几个不同的记录器之后,我对nodejs记录器有了更多的了解,现在我相信它们不应该一起使用,因为它们是为不同的目的设计的。另一方面,morgan和winston可以一起使用,例如Node.js-logging/Use morgan and winston,morgan and debug也可以一起使用。Nodejs-如何将morgan与debug 一起使用

但首先,引用Node.js中的Logging所做的正确

在Node.js应用程序中设置正确的日志记录可能很麻烦由于通过NPM。

当我让morgan、winston一起调试时,我确实遇到了这种情况。但后来我意识到,它们是为了不同的目的而重叠的。因此,当我真正调试问题时,我会使用debugjs,而不是使用console.log(有些人说debugjs不是记录器)。在我完成它之后,我关闭了调试。

Morgan是专门记录express HTTP请求的。最好在dev/prod-env中使用它以达到不同的目的。

在dev/prod-env中为Winston使用不同的日志级别可能是一种常见的做法。我还可以使用express winston来记录HTTP请求,而不是使用morgan。

Winston使用不同的日志级别来关闭一些日志,不像debugjs使用名称空间来关闭日志,所以我认为它们不能一起工作。

---2021年更新---

自2018年我第一次回答自己的问题以来,有人多次问我有关日志级别的问题。我发现一个针对debugjs的问题证实了我所说的调试,引用了其当前维护者的答案

调试不是一个通用的日志库,它的目的是有条件地打开调试日志。没有日志级别的概念。相反,将命名空间分解为不同的组件,并启用那些你关心的

开始将调试(…)调用传递到winston中可能很有用。您可以覆盖debug.log函数来实现这一点。

const logger  = require('./v1/lib/logger'); //my winston logger
const util    = require('util');
const debug     = require('debug');
//for testing and dev use the regular debug (optional) 
if (process.env.NODE_ENV === 'production') {
debug.log = (...args) => logger.info(util.format(...args))
}
module.exports =  debug;

在处理debugwinston时,您可能还想覆盖formatArgs函数,因为debug.log正在接收已经着色的参数(取决于环境),并且在某些情况下可能会产生意外结果(例如设置env与模块加载顺序)。

import debug from "debug";
import util from "util";
import winston from "winston";
// create winston logger
const logger = new winston.Logger({ /*...*/ });
// keep original arguments
debug.formatArgs = (args) => { /* do nothing */ };
// override logging (keep function to use `this`)
debug.log = function(...args) {
// log to winston
logger.log("info", {
// `this` is bound to debug instance
namespace: this.namespace,
// format as in `console.log`
message: util.format(...args),
// add message time
timestamp: new Date().toISOString(),
// optionally log also diff time
diff: '+' + debug.humanize(this.diff),
});
};
// enable all debug
debug.enable('*');

最新更新