Winston:了解日志记录级别

Posted

技术标签:

【中文标题】Winston:了解日志记录级别【英文标题】:Winston : understanding logging levels 【发布时间】:2014-01-22 17:49:22 【问题描述】:

阅读和摆弄 Winston,我很困惑为什么日志记录级别按原样排序以及为什么传输以它们的方式运行(嗯,至少是控制台之一)。如果有人能够(甚至可能是彻底地)通过真实的用例示例解释为什么使用 Winston 进行日志记录以这种方式工作,我将不胜感激?

例如,我这样设置我的记录器:

var logger = new (winston.Logger)(
  levels: winston.config.syslog.levels,
  colors: winston.config.syslog.colors,
  level: "debug",  // I'm not sure what this option even does here???
  transports: [
    new (winston.transports.Console)(
      colorize: true,
      handleExceptions: true,
      json: false,
      level: "debug"
    )
  ]
);

所以,如果我执行logger.debug("Test");,那么它将记录debug: Test,很好。但是如果我这样做logger.info("Test");,那么什么都不会发生。

我遇到的问题是,如果我想登录控制台everything 但是 debug 消息,我该怎么办? ...甚至debug info 消息,但记录其他所有内容?

来自 Java 世界,使用标准记录器,我习惯了 debugwarn 更“细粒度”,并且记录器向后工作;例如,将日志记录级别设置为info,确实记录了除debug(或其他内容)之外的所有内容。

另外,如果我希望记录器仅记录 errorwarninginfo 消息,我该如何使用 Winston?

* 编辑 *

显然,这种等级顺序是winston.config.syslog.levels 独有的。所以剩下的唯一问题是:“是否有可能以某种方式将传输限制为仅非常特定的日志记录级别?”

【问题讨论】:

确实,winston pre 2.0 中存在一个错误:winston.config.syslog.levels 的级别数值与默认值相反!使用它们会使温斯顿无法使用。这已在 2.0.0 中修复:github.com/winstonjs/winston/blob/master/… 由于这个问题已经收到很多意见:在winston 3.0 中,可以使用自定义格式化程序来限制传输仅记录特定级别[s]:***.com/a/56918394/4451284 【参考方案1】:

根据documentation,您可以设置自己的日志记录级别,0 为最低,并将颜色与之关联。现在,如果您不想记录最低级别,只需将level 属性设置为相应级别即可。默认情况下,控制台记录器的级别设置为info

所以,这里有一个例子:

logger = new (winston.Logger)(
  levels: 
    'info': 0,
    'ok': 1,
    'error': 2
  
  transports: [
    new (winston.transports.ConsoleTransport)(silent: options.silent, level: 'ok')
  ]
);

【讨论】:

是的,我知道颠倒了关卡的顺序。但是,这并不能回答为什么官方级别是它们的全部方式。此外,它没有回答有关让传输(即控制台)仅拦截某些级别的问题。在您的示例中,传输将回显任何okerror,而不仅仅是ok 直观地说,我认为您希望回显高于给定级别。我不知道winston 中是否有仅过滤特定日志的功能,但作为一种解决方法,您可以调整您的级别,使OK 的优先级高于ERROR,这样您就可以过滤掉它。 . 我会环顾四周,看看winston 是否可以过滤单个级别的日志。 是的,我认为这就是正在发生的事情。您无法在忽略更高级别时设置要显示的特定级别。见Issue #89 谢谢,尽管这个问题是 2 年前的问题,但它让我意识到问题的根源是 syslog 级别/颜色,因为默认级别没有这个问题。我编辑了我的问题以反映这一点。 哈哈...没想到2年后我会读到这篇文章并找到你的答案。【参考方案2】:
var logger = new (winston.Logger)(
       levels: 
        'info': 0,
        'ok': 1,
        'error': 2
       ,
    colors: 
        'info': 'red',
        'ok': 'green',
        'error': 'yellow'
       ,
    transports: [
        new (winston.transports.Console)(level:'info',colorize: true)
    ]
);
logger.log('info',"This is info level");
logger.info("This is info level");

【讨论】:

以上是关于Winston:了解日志记录级别的主要内容,如果未能解决你的问题,请参考以下文章

Winston 日志记录对象

Winston:多进程日志记录

运行单元测试时禁用winston日志记录?

Winston Logging - 单独的级别以单独的传输

如何刷新winston日志?

温斯顿:尝试在没有传输的情况下写入日志 - 使用默认记录器