【问题标题】:winston full custom file output温斯顿全自定义文件输出
【发布时间】:2016-12-13 00:48:09
【问题描述】:

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


我已经掌握了 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

我在winston 中直接提供了some researchit seems there is no such functionnality。我注意到了fancy bunyan CLI tool,但我想要的“似乎”要简单得多。

问题:

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

2)如果我必须自己对其进行硬编码,您能否给我一些指导(以我想要的方式处理标准输出而不会使应用程序本身过载的最佳实践),尤其是在涉及由某些错误返回的复杂对象时?

【问题讨论】:

    标签: javascript node.js logging winston


    【解决方案1】:

    [回答我自己的问题]

    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 !!!!!!!!!!!
            })
        ]
    });

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 2019-10-28
      • 2014-12-10
      • 2017-09-13
      • 1970-01-01
      • 2021-02-23
      • 2016-08-29
      相关资源
      最近更新 更多