我正在使用winston保存日志,我将日志保存到文件中。
var winston = require('winston');
var moment = require('moment');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.File)({
name: 'info-file',
filename: 'console.log',
timestamp : function() {return moment().utcOffset(330).format('DD-MM HH:mm'); },
level: 'info'
}),
new (winston.transports.File)({
name: 'debug-file',
filename: 'console.log',
timestamp : function() {return moment().utcOffset(330).format('DD-MM HH:mm'); },
level: 'debug'
}),
new (winston.transports.File)({
name: 'error-file',
filename: 'console.log',
timestamp : function() {return moment().utcOffset(330).format('DD-MM HH:mm'); },
level: 'error'
}),
new (winston.transports.File)({
name: 'unhandled-error-file',
filename: 'console.log',
timestamp : function() {return moment().utcOffset(330).format('DD-MM HH:mm'); },
handleExceptions: true
})
]
});
这是我正在运行的命令:
router.get('/exercise_excel_entry', function(req,res){
logger.log('info', "info testing");
logger.log('debug', "debug testing");
logger.log('error', "error testing");
res.render('exercise_excel_entry');
});
这是保存在文件中的输出:
{"level":"info","message":"info testing","timestamp":"04-02 11:51"}
{"level":"error","message":"error testing","timestamp":"04-02 11:51"}
{"level":"info","message":"info testing","timestamp":"04-02 11:51"}
{"level":"info","message":"info testing","timestamp":"04-02 11:51"}
{"level":"error","message":"error testing","timestamp":"04-02 11:51"}
{"level":"debug","message":"debug testing","timestamp":"04-02 11:51"}
{"level":"error","message":"error testing","timestamp":"04-02 11:51"}
{"level":"error","message":"error testing","timestamp":"04-02 11:51"}
我不明白为什么信息和错误标记的日志会重复
答案 0 :(得分:0)
根据winston docs:
winston允许您在每个传输上定义一个级别属性 指定传输应记录的最大消息级别。
此处的关键字是最大。
默认日志记录级别为:
{ error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5 }
所以在你的情况下:
info-file
会记录级别为“info”或更高级别的消息(错误&
警告)。 debug-file
将记录级别为“debug”或更高级别的消息
(错误,警告,信息和详细)。 error-file
会记录消息
级别“错误”或更高级别(除了未处理的例外情况之外的所有内容)。unhandled-error-file
会记录级别为“未处理错误”的邮件
仅并且您已使用文件名console.log
进行所有传输。
所以日志的顺序如下:
logger.log('info', "info testing"); // both info-file & debug-file transport logs it
logger.log('debug', "debug testing"); // only debug-file transport logs it
logger.log('error', "error testing"); // info-file, debug-file and error-file transports logs it
这样就解释了info
&的多个条目。日志文件中的error
条消息。
修改强>
不是最佳解决方案(因为这会为不记录的级别添加空行):
new (winston.transports.File)({
name: 'info-file',
filename: 'console.log',
timestamp : function() {return moment().utcOffset(330).format('DD-MM HH:mm'); },
level: 'info',
filters: [function (level, msg, meta) {
return (level === 'info') ? msg : '';
}],
formatter: function(options) {
return msg === '' ? '' : { level: options.level, timestamp: options.timestamp, message: options.message, meta: options.meta };
}
})