Winston 元数据未附加到消息

分享于2022年07月17日 logging node.js winston 问答
【问题标题】:Winston 元数据未附加到消息(Winston meta data is not appending to message)
【发布时间】:2022-01-26 17:22:03
【问题描述】:

为了获取日志

2021-12-27T20:46:59.136Z -> info: [socketconnection] 此消息将 包含一个完整的对象:{name: 'AAA'}

。我创建了一个自定义格式化程序作为 winston config.js

    const { createLogger, format, transports } = require('winston');
const { splat, combine, timestamp, label, printf, simple } = format;
const path = require('path');

const myFormat = printf(({ level, message, timestamp, meta }) => {

  return `${timestamp} -> ${level}:\t${JSON.stringify(message)}`;
});

// define the custom settings for each transport (file, console)
const options = {
  file: {
    level: 'info',
    filename: `${path.join(__dirname, '../logs/app.log')}`,
    handleExceptions: true,
    humanReadableUnhandledException: true,
    json: true,
    maxsize: 5242880, // 5MB
    maxFiles: 5,
    timestamp: true,
    colorize: false,
  },
  console: {
    level: 'debug',
    handleExceptions: true,
    json: true,
    colorize: true,
  },
};


module.exports = (moduleName) => {
  let logger;
  if (process.env.logging === 'off') {
    logger = createLogger({
      format: combine(
        timestamp(),
        label({ label: `${moduleName}`, message: true }),
        myFormat
      ),
      transports: [
        new winston.transports.File(options.file),
      ],
      exitOnError: false, // do not exit on handled exceptions
    });
  } else {
    logger = createLogger({
      format: combine(
        timestamp(),
        label({ label: `${moduleName}`, message: true }),
        myFormat
      ),
      transports: [
        new transports.File(options.file),
        new transports.Console(options.console),
      ],
      exitOnError: false, // do not exit on handled exceptions
    });
  }

  // create a stream object with a 'write' function that will be used by `morgan`
  logger.stream = {
    write(message) {
      logger.info(message);
    },
  };
  return logger;
};

我是这样的

2021-12-27T21:26:07.148Z -> 信息:[socketconnection] 这个 消息将包含一个完整的对象:

登录为,

logger.info('这​​条消息将包含一个完整的对象:', s);

s 在哪里

`var s = {'name':'AAA'};

元未附加到消息。我在这里缺少什么


【解决方案1】:

#1 编辑这一行:

const myFormat = printf(({ level, message, timestamp, ...meta }) => {

因为 meta 是一个数组,所以你需要 spread 它才能使用它。


#2 winston's docs 说的很清楚:

级别和消息之外的属性被视为“元”。即:

所以 meta 没有附加到 message ,尝试使用它:

`${JSON.stringify(meta)}`

  • 非常感谢好友