29

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

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

4

5 回答 5

35

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

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

将日志级别设置为“调试”。(使用 winston 0.7.3 测试,默认记录器仍在 3.2.1 中)。

但是,文档建议创建具有适当日志级别的新记录器,然后使用该记录器:

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

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

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

// custom logger
myLogger.log('debug', 'custom logger being used');
于 2014-04-08T10:41:56.200 回答
25

看起来这里涵盖的选项中有一个级别选项

从那个文档:

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 方法以在运行时更改。查看该文档的使用日志级别部分。

于 2013-03-20T23:08:53.053 回答
8

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

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

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

上面的代码会将日志级别设置为warn,这意味着silly,verbose并且info不会输出到 somefile.log ,而warn,debugerrorwill 。

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

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 个预定义关卡,以防在某处使用了预定义关卡。

于 2013-03-21T03:58:56.240 回答
3

您可以通过修改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';

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

于 2014-03-18T11:14:12.730 回答
0

If you want to change the log level on the fly. Like for when you need to trace production issue for short amount of time; then revert to error log level. You can use a dynamic logger provided you can expose a service on the web https://github.com/yannvr/Winston-dynamic-loglevel

于 2014-08-07T14:57:06.710 回答