如何使用 winstonjs 3.2+ 生成与 splat 相同的输出

Gra*_*ier 2 logging node.js winston

我一直在推迟将winstonjs从升级3.1.03.2.x,因为我无法让它以同样的方式处理额外的元数据。

例如,我在整个应用程序中都有日志消息,其中包括字符串和对象形式的元数据。在3.1.0此设置中,可以很好地创建我正在寻找的输出:

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

const formatStr = printf(info => {
  return `[${info.timestamp}] ${info.level}\t ${info.label} ${info.message} ${JSON.stringify(info.meta)}`
});

let logger = createLogger({
  transports: [new transports.Console({ level: 'info' })],
  format: combine(
    colorize({message: true, level: true}),
    timestamp({format: 'MMM D, YYYY HH:mm'}),
    format.splat(),
    formatStr
  )
});

logger.info('any message',{extra: true});
logger.info('simple', "one", "two",{extra: true});
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

[Jan 3, 2020 14:36] info     undefined any message {"extra":true}
[Jan 3, 2020 14:36] info     undefined simple ["one","two",{"extra":true}]
Run Code Online (Sandbox Code Playgroud)

3.2.1我能得到的最接近理想的日志格式是:

[Jan 3, 2020 14:31] info     undefined any message {"extra":true,"timestamp":"Jan 3, 2020 14:31"}
[Jan 3, 2020 14:31] info     undefined simple {"0":"t","1":"w","2":"o","timestamp":"Jan 3, 2020 14:31","extra":true}
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

[Jan 3, 2020 14:36] info     undefined any message {"extra":true}
[Jan 3, 2020 14:36] info     undefined simple ["one","two",{"extra":true}]
Run Code Online (Sandbox Code Playgroud)

随着https://github.com/winstonjs/winston/blob/master/CHANGELOG.md#new-splat-behaviormeta中的数据被删除,我该如何将其与我现有的日志记录结构结合使用我的应用程序中到处都是?3.2.0

小智 6

我遇到过类似的问题。我在用着winston 3.2.1

我找到了一个解决方案,不使用该splat格式并从元数据中检索它。以下是如何获取所需输出的示例。

const formatMeta = (meta) => {
  // You can format the splat yourself
  const splat = meta[Symbol.for('splat')];
  if (splat && splat.length) {
    return splat.length === 1 ? JSON.stringify(splat[0]) : JSON.stringify(splat);
  }
  return '';
};

const customFormat = winston.format.printf(({
  timestamp,
  level,
  message,
  label = '',
  ...meta
}) => `[${timestamp}] ${level}\t ${label} ${message} ${formatMeta(meta)}`);

const logger = createLogger({
  transports: [new transports.Console()],
  format: combine(
    format.colorize(),
    format.timestamp({format: 'MMM D, YYYY HH:mm'}),
    customFormat,
    // Do not use splat format
  )
});

logger.info('any message', { extra: true });
logger.info('simple', "one", "two", { extra: true });
Run Code Online (Sandbox Code Playgroud)

输出:

[Mar 26, 2020 13:03] info     any message {"extra":true}
[Mar 26, 2020 13:03] info     simple ["one","two",{"extra":true}]
Run Code Online (Sandbox Code Playgroud)