如何在 Winston/Node.js 中设置日志级别

Posted

技术标签:

【中文标题】如何在 Winston/Node.js 中设置日志级别【英文标题】:How to set log level in Winston/Node.js 【发布时间】:2013-03-10 06:41:27 【问题描述】:

我在我的 Node.js 应用程序中使用 Winston 日志记录并定义了文件传输。在我的整个代码中,我使用logger.errorlogger.warnlogger.info 登录。

我的问题是,如何指定日志级别?是否有我可以设置的配置文件和值,以便只记录适当的日志消息?例如,我希望日志级别在我的开发环境中为“信息”,但在生产环境中为“错误”。

【问题讨论】:

【参考方案1】:

如果您使用的是默认记录器,您可以像这样调整日志级别:

const winston = require('winston');
// ...
winston.level = 'debug';

将日志级别设置为“调试”。 (使用 winston 0.7.3 测试,default logger is still around in 3.2.1)。

但是,the documentation recommends creating a new logger 具有适当的日志级别,然后使用该记录器:

const myLogger = winston.createLogger(
  level: 'debug'
);
myLogger.debug('hello world');

如果您已经在代码库中使用the default logger,这可能需要您将所有用法替换为您正在使用的这个新记录器:

const winston = require('winston');
// default logger
winston.log('debug', 'default logger being used');

// custom logger
myLogger.log('debug', 'custom logger being used');

【讨论】:

是的,这是正确的答案,其他的需要创建一个新的记录器,不要调整winston创建的现有默认记录器的设置。 这是最难找到的信息!谢谢@AndreasPizsa! @RudolfOlah 正确的答案是文档推荐的内容,即创建一个新的记录器。动态更改默认记录器(或任何其他已创建的记录实例)的日志级别已在 winston 的 github 问题中讨论过无数次,结果在大多数情况下 - 虽然它可能适用于大多数甚至最近/当前版本 - 到不要这样做。不要仅仅因为答案更符合您的个人喜好而称其为“正确”。然而,有一些库围绕着 winston 提供了这个功能。 感谢,谢谢。介意与此类库共享一些链接或搜索词吗? @RudolfOlah 哦,这很有趣 - 不小心提到了 RudolfOlah,而实际上我的意思是 @Num Lock。感谢你们的贡献和洞察力!【参考方案2】:

您可以通过修改相应传输的level 属性来更改运行时的日志记录级别:

var log = new (winston.Logger)(
    transports: [
        new (winston.transports.Console)( level : 'silly' )
    ]
);

...

// Only messages with level 'info' or higher will be logged after this.
log.transports.Console.level = 'info';

我猜,它对文件的工作方式类似,但我没有尝试过。

【讨论】:

【参考方案3】:

winston 有 6 个默认级别:silly=0(最低)、debug=1、verbose=2、info=3、warn=4、error=5(最高)

在创建记录器传输时,您可以指定日志级别,例如:

new (winston.transports.File)( filename: 'somefile.log', level: 'warn' )

以上代码会将日志级别设置为warn,这意味着sillyverboseinfo不会输出到somefile.log,而warndebugerror会。

您还可以定义自己的级别:

var myCustomLevels = 
  levels: 
    foo: 0,
    bar: 1,
    baz: 2,
    foobar: 3
  
;

var customLevelLogger = new (winston.Logger)( levels: myCustomLevels.levels );
customLevelLogger.foobar('some foobar level-ed message');

请注意,最好始终在您自己的自定义关卡中包含 6 个预定义关卡,以防某处使用了预定义关卡。

【讨论】:

陈,谢谢您的回答。我已经接受了上面布莱恩的回答。但你的也很有帮助。 很抱歉,@Chen 错了。调试低于详细。建议修改。 @filsmick 你是对的。当我写这个答案时,Debug 比 verbose 高,但现在 verbose 更高。 @Chen 哦,不知道它曾经更高。看到这个我就歪了,因为没有意义,所以我测试了一下:) 一个级别是否可以只听到自己的级别?没有任何级别的价值高于它?但只有而且只有它自己的水平?【参考方案4】:

如果您想即时更改日志级别。比如当您需要在短时间内跟踪生产问题时;然后恢复到错误日志级别。您可以使用动态记录器,前提是您可以在网络上公开服务https://github.com/yannvr/Winston-dynamic-loglevel

【讨论】:

【参考方案5】:

看起来herehere传递的选项中有一个级别选项

来自该文档:

var logger = new (winston.Logger)(
  transports: [
    new (winston.transports.Console)( level: 'error' ),
    new (winston.transports.File)( filename: 'somefile.log' )
  ]
);

现在,这些示例显示了将选项对象中的级别传递到控制台传输。当您使用文件传输时,我相信您会传递一个不仅包含文件路径而且还包含级别的选项对象。

这应该会导致类似:

var logger = new (winston.Logger)(
  transports: [
    new (winston.transports.File)( filename: 'somefile.log', level: 'error' )
  ]
);

根据该文档,另请注意,从 2.0 开始,它公开了一个 setLevel 方法以在运行时更改。查看该文档的使用日志级别部分。

【讨论】:

bryanmac,感谢您的回复,但我担心它仍然无法回答我的问题。让我澄清一下。在我之前的工作中,我们使用了一个自定义日志模块,它与 winston 的功能非常相似。该模块依赖于设置日志级别的配置文件中的条目。如果我们必须调试任何问题,我们将更改配置文件中的条目以增加日志的详细程度。但在其他时候,我们会将级别设置为最低级别,以便仅记录错误。温斯顿能做到这样吗? 上面的程序代码可以从日志文件中读取来设置初始日志级别。现在,要在运行时从初始/默认级别更改,您可以公开一个 API,该 API 可以转身并调用我提到的 setLevel 方法。这样你就可以有一个管理页面来读取日志级别和设置它的方法。 布莱恩,我将接受您的初始回答 + 您的评论作为我问题的答案。谢谢。 谢谢 - 如果您对使用它的方式或效果有任何其他反馈或想法,我们将不胜感激。我现在正在经历同样的事情:) Bryan,我一定会回来在这里分享我的实现细节。

以上是关于如何在 Winston/Node.js 中设置日志级别的主要内容,如果未能解决你的问题,请参考以下文章

如何在 yocto 中设置系统日志?

python 如何在tensorflow中设置日志记录级别

如何使用winston在子目录而不是根目录中设置日志?

如何在运行时在 org.jboss.logging 中设置日志记录

如何使用 AWS 在 Docker Cloud 中设置链接到 S3 的卷?

如何使用带有 json 的 Map 从数据库中设置地图 latlng 值?