首先在nodejs winston logger中写入时间戳

write the timestamp first in nodejs winston logger

我试图让时间戳首先出现,但它总是被添加到 json 的末尾。

我用过这个配置:

    var myFormat = winston.format.combine(winston.format.timestamp({format:'YYYY-MM-DD HH:mm:ss.SSS'}),
                                          winston.format.json());
    this.winstonLogger = winston.createLogger();
    this.winstonLogger.configure({
        level: 'info',
        format: myFormat,
        transports: [
            new winston.transports.Console(),
          ]
    });

并得到如下日志:

{"level":"info","message":"app is loaded","timestamp":"2019-06-03 17:01:10.054"}

我只想要它看起来像:

{"timestamp":"2019-06-03 17:01:10.054","level":"info","message":"app is loaded"}

您可以开发自己的格式化程序

const winston = require('winston');

class TimestampFirst {
    constructor(enabled = true) {
        this.enabled = enabled;
    }
    transform(obj) {
        if (this.enabled) {
            return Object.assign({
                timestamp: obj.timestamp
            }, obj);
        }
        return obj;
    }
}

var myFormat = winston.format.combine(
    winston.format.timestamp({
        format: 'YYYY-MM-DD HH:mm:ss.SSS'
    }),
    new TimestampFirst(true),
    winston.format.json()
);

winstonLogger = winston.createLogger();
winstonLogger.configure({
    level: 'info',
    format: myFormat,
    transports: [
        new winston.transports.Console(),
    ]
});


winstonLogger.info('hello', {
    message: 'test'
});

更多信息https://github.com/winstonjs/logform

您可以使用 JSON.stringify()printf()。只需将您的 myFormat 变量更改为:

var myFormat = winston.format.combine(
  winston.format.timestamp({format: 'YYYY-MM-DD HH:mm:ss.SSS'}),
  winston.format.printf((info) => {
    return JSON.stringify({timestamp: info.timestamp, 
                           level: info.level, 
                           message: info.message});
}));