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

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

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

【问题讨论】:

    标签: node.js express winston


    【解决方案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,我一定会回来在这里分享我的实现细节。
        猜你喜欢
        • 2015-04-21
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 2016-07-25
        • 1970-01-01
        • 2023-02-15
        • 2014-01-22
        • 2020-05-11
        相关资源
        最近更新 更多