Winston中是否有类似于log.IsDebugEnabled的等效方法?

5

在Winston中是否有类似于log.IsDebugEnabled的功能?

我想在生产环境中跳过昂贵的日志记录代码,但在开发环境中执行它。

例如:

if(winston.isDebugEnabled){
   // Call to expensive dump routine here
   dump();
}

检查 winston.debug 只是检查该方法是否被定义,而不是它是否已启用。

非常感谢!


编辑:添加了代码示例。

4个回答

2

我已经添加了一个方法到我的日志记录器中,以实现这一点:

logger.isLevelEnabled = function(level) {
  return _.any(this.transports, function(transport) {
    return (transport.level && this.levels[transport.level] <= this.levels[level])
      || (!transport.level && this.levels[this.level] <= this.levels[level]);
  }, this);
};

该函数遍历日志器的每个传输器并检查它们是否需要记录指定级别的日志。

注意: _.anylodash 库中的函数,你也可以使用 for 循环代替。


1

自Winston 3.1.0 (PR)起,您可以使用Logger函数isLevelEnabled(string)isXXXEnabled()来实现此功能。


0

我相信你可以直接从winston获取到那个,但如果你想为不同的环境设置不同的日志级别,你应该在创建winston.logger时传入这些参数。

例如:

// default log file level is info (which is the lowest by default)
var logFileLevel = 'info';

if (process.env.NODE_ENV == 'production') {
    // only write logs with a level of 'error' or above when in production
    logFileLevel = 'error';
}

var logger = new (winston.Logger)({
    transports: [
        new (winston.transports.File)({ 
            filename: '/var/log/node-logger.log',
            level: logFileLevel
        })
    ]
});

切换传输方式也非常有用。例如,在开发过程中可能希望使用控制台传输方式,而在生产环境中则使用文件传输方式。

更多关于这些内容的文档,请参阅winston readme


谢谢Ben。如果无法从Winston本身中获取它,可能必须这样做。我不确定这是否是Node.js模块的好解决方案 - 必须传递标志或要求带有标志的模块。 - Thomas Bratt

0

尝试一下

if ( logger.levels[logger.level] >= logger.levels['debug'] ) {
    // expensive calculation here
    logger.debug(...)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接