Nodejs,Winston:日志条目重复

时间:2017-02-04 06:27:07

标签: node.js express winston

我正在使用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"}

我不明白为什么信息和错误标记的日志会重复

1 个答案:

答案 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 };
    }
})