我在我的 Node.js 应用程序中使用 Winston 日志记录并定义了文件传输。在我的整个代码中,我使用logger.error
、logger.warn
或进行日志记录logger.info
。
我的问题是,如何指定日志级别?是否有我可以设置的配置文件和值以便只记录适当的日志消息?例如,我希望日志级别在我的开发环境中为“信息”,但在生产环境中为“错误”。
如果您使用的是默认记录器,则可以像这样调整日志级别:
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');
从那个文档:
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 方法以在运行时更改。查看该文档的使用日志级别部分。
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
,debug
和error
will 。
您还可以定义自己的级别:
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 个预定义关卡,以防在某处使用了预定义关卡。
您可以通过修改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';
我想,它对文件的工作方式类似,但我没有尝试过。
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