Winston 记录器将 "undefined" 附加到每个日志条目

Winston logger appends "undefined" to every log entry

在基于 node.js / express.js 的应用程序中,winston 日志记录框架(版本 2.4.0)用于日志记录。这工作正常,除了 undefined 附加到每个日志输出。输出类型(字符串、对象、..)不会改变该行为。 Winston 用于多个 .js 文件,如下所示:

const logger = require('winston')
..
logger.info(`Handled request in ${Date.now() - start}ms.`);

上述日志语句的输出是:

info: Handled request in 667ms.undefined

当 logger.{info|debug|..} 被替换为记录到控制台的语句时,输出符合预期;只是要记录的语句,最后连接 'undefined'。

可能是什么原因?

我不确定这是什么原因,我真的没有时间深入研究这个问题,但无论出于何种原因,winston 创作者提供的示例代码对我来说无法正常工作并附加了这个'undefined' 每行之后。就像你的情况一样。

我在 winston 模块中快速搜索了 'eol',并在控制台函数的 console.js 中打印了所有选项和 eol 参数。事实证明,不知何故默认没有指定 eol,因此这个 'undefined' 附录。事实上,我在 winston.configure() 中使用的任何选项都没有进入控制台功能。但是,如果我们明确地创建新的控制台并将选项传递给它(包括 eol),它会工作得很好。

tl;博士; 我建议您尝试使用此代码来初始化您的 winston 日志记录并修改它以满足您的需要:

const winston = require('winston');
winston.configure({
  transports: [
    new winston.transports.Console({
      level: 'silly',
      eol: '\n',
      timestamp: true,
      colorize: true,
    })
  ]
});
winston.silly('testing')

它更像是一种解决方法,而不是真正的解决方案,但是嘿,它有效,对吧?

编辑: 如果你在 windows,你可能想试试 '\r\n' eol。