创建自己的Winston记录器文件

时间:2016-08-18 11:51:20

标签: javascript node.js logging winston

这是我设置的基本winston记录器:

var winston = require('winston')

var systemLogger = new (winston.Logger)({
  transports: [
    new (winston.transports.File)({
      name: 'system-file',
      // log which stores all the errors
      filename: './test.log',
      json: true,
      timestamp: true
    })
  ]
})

systemLogger.log('info', 'hello')
systemLogger.log('error', '-----hello2')

这会创建一个这样的日志文件:

{"level":"info","message":"hello","timestamp":"2016-08-18T11:48:22.081Z"}
{"level":"error","message":"-----hello2","timestamp":"2016-08-18T11:48:22.083Z"}

但我想在文件中看起来像这样:

INFO: 2016-08-18T11:48:22.081Z hello 
ERROR: 2016-08-18T11:48:22.083Z *** -----hello2 *** 

这可能吗?

我读过这个 - https://github.com/winstonjs/winston#custom-log-format但我实际上找不到如何做到这一点 - 如果可能的话。

我尝试过添加格式化程序:

  formatter: function(options) {
    // Return string will be passed to logger.
    if (options.level === 'error') {
      return options.timestamp() +' ******** '+ options.level.toUpperCase() +' ******** '+ (undefined !== options.message ? options.message : '') 
    }
    else if (options.level === 'info') {
      return options.timestamp() +' '+ options.level.toUpperCase() +' '+ (undefined !== options.message ? options.message : '') 
    }
  }

然而,这似乎只适用于Console打印,而不适用于File。因为teh文件的保存方式与没有格式化程序的方式相同。

3 个答案:

答案 0 :(得分:0)

在您的记录器设置代码中,您必须放置格式化程序以及从格式化程序返回的字符串,它将显示在您的日志文件中。

formatter: function(options) {
        // Return string will be passed to logger.
        return options.timestamp() +' '+ options.level.toUpperCase() +' '+ (undefined !== options.message ? options.message : '') +
          (options.meta && Object.keys(options.meta).length ? '\n\t'+ JSON.stringify(options.meta) : '' );
      }

因此,上面的格式化程序将首先打印时间戳,然后是日志级别,然后是您记录的实际消息。

希望这会有所帮助......

答案 1 :(得分:0)

您需要创建格式化程序函数:

$ cat logger.js 
var winston = require('winston');

module.exports = (function(){

    function formatter (args){
            var timestamp = new Date().toISOString(),
                level =  args.level.toUpperCase(),
                message = args.message;

        return level+": "+timestamp+" "+message ;
    }

    return new (winston.Logger)({
        transports: [
            new (winston.transports.Console)({
                formatter: formatter,
            }),

            new (winston.transports.File)({
                formatter: formatter,
                filename : "./logs/custom-logger.log",
                maxsize : 1024 * 1024 * 500,
                maxFiles : 10,
                json : false,
                tailable : true,
            })
        ]
    });
}()); 

答案 2 :(得分:0)

您需要做的只是添加:json : false

所以它看起来像这样:

var winston = require('winston')

var systemLogger = new (winston.Logger)({
  transports: [
    new (winston.transports.File)({
      name: 'system-file',
      json : false,
      // log which stores all the errors
      filename: './test.log',
      json: true,
      timestamp: true
    })
  ]
})

你很亲密,努力尝试!