winston完整自定义文件输出

时间:2016-08-06 21:41:18

标签: javascript node.js logging winston

编辑:找到答案,并为未来的读者发布完整答案。

我已经掌握了Node.js中winston logging的基础知识,并希望自定义我的日志记录。以下是我到目前为止的情况:

var winston = require('winston');         

winston.remove(winston.transports.Console);
winston.add(winston.transports.Console, {'colorize': true});
winston.add(winston.transports.File,
  {
    'filename': 'testlog.log',
    'timestamp': function() {return Date.now();},
  }
);

// let's say I only want to log 'info' or 'error'
function loginfo(arg) {return winston.info(arg);}
function logerror(arg) {return winston.error(arg);}

输出文件如下所示:

{"level":"info","message":"someinfo","timestamp":1470515515807}
{"level":"error","message":"someerror","timestamp":1470515515808}

我理解JSON格式标准日志记录很重要,因此我希望保持几乎标准的文件传输。

但是因为我实际上正在阅读这些日志的每一行,所以我想打开第三个传输到另一个文件,只为我的眼睛提供完全自定义的格式,例如:

1470515515807 info "someinfo"
1470515515808 error "someerror"
1470515519532 error HERE_GOES_SOME_COMPLEX_ERROR_MESSAGE_OR_OBJECT_
I_WANT_TO_SEE_AS_PRETTY_POSSIBLE_DESPITE_THE_FACT_IT_IS_VERY_COMPLEX

我已经在温斯顿直接提供了some researchit seems there is no such functionnality。我注意到fancy bunyan CLI tool,但我想要的“似乎”更简单。

问题:

1)在日志库中是否没有符合我要求的内置自定义输出格式? [不敢相信]

2)如果我必须自己硬编码,你能给我一些指示(最好的做法是以我想要的方式处理stdout而不会超载应用程序本身),特别是当涉及到某些错误返回的复杂对象时?

1 个答案:

答案 0 :(得分:2)

[回答我自己的问题]

Winston有一个简单高效的自定义格式化程序选项,GitHub readme的最底部提供了一个示例。

以我的例子为例,没有检查每个参数存在的最小代码是:



var log = new (winston.Logger)({

    transports: [

        new (winston.transports.File)({
            name: 'info_normal',
            filename: './log_info.log',
            level: 'info',
            timestamp: function(){return Date.now();}
        }),

        new (winston.transports.File)({
            name: 'info_custom',
            filename: './log_info_custom.log',
            level: 'info',
            timestamp: function(){return Date.now();},
            formatter: function(options) {
                // Returned string will be passed to the logger
                return options.timestamp() + ' ' + options.level + ' ' + 
                options.message + ' ' + JSON.stringify(options.meta);
            },
            json: false //don't forget it !!!!!!!!!!!
        })
    ]
});




从那里开始,改进定制非常容易。寒冷,温斯顿!