如何在winston中记录JavaScript对象和数组作为console.log呢?

Tom*_*mmz 28 javascript arrays logging node.js winston

我一直在寻找顶级节点记录系统:npmlog,log4js,bunyanwinston并决定使用winston具有最npm每月下载.

我想要设置的是自定义记录器,我将能够在开发环境中使用logger.debug(...)它,不会在生产环境中记录任何内容.这对我有帮助,所以当我在开发环境中时,我不需要写任何东西,因为我会看到所有的输出.

这就是我现在拥有的:

var level = 'debug';
if (process.env.NODE_ENV !== 'development'){
  level = 'production'; // this will never be logged!
}

var logger = new winston.Logger({
  transports: [
    // some other loggings
    new winston.transports.Console({
      name: 'debug-console',
      level: level,
      prettyPrint: true,
      handleExceptions: true,
      json: false,
      colorize: true
    })

  ],
  exitOnError: false // don't crush no error
});
Run Code Online (Sandbox Code Playgroud)

当我尝试记录JavaScript Object或Javascript 时出现问题Array.有了Object,我需要做的toJSON(),以及Array我需要首先JSON.stringify(),然后JSON.parse().

写这些方法的所有时间都不好,只是为了记录我想要的东西.此外,它甚至不是资源友好的,因为这些格式化方法需要在logger.debug()实现它生产之前执行,并且它不应该首先记录它(基本上,它在函数调用之前评估参数).我只是喜欢古老的console.log()Java对象和数组.

现在,当我写这个问题时,我发现有一种方法可以描述每个winston 对象的自定义格式transports.这是做到这一点的方式,还是有其他方式?

Leo*_*Leo 26

logger.log("info", "Starting up with config %j", config);
Run Code Online (Sandbox Code Playgroud)

Winstons使用内置的utils.format库. https://nodejs.org/dist/latest/docs/api/util.html#util_util_format_format_args

  • 提醒一下,您需要启用format.splat().否则它不起作用. (3认同)
  • 为您的答案提供一些解释,说明为什么它会这样工作或 OP 做错了什么。只是像这样的代码粘贴会被标记。 (2认同)

Bha*_*tan 15

尝试将prettyPrint参数更改为

prettyPrint: function ( object ){
    return JSON.stringify(object);
}
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,你也可以做`prettyPrint:JSON.stringify` (7认同)
  • 如果`object`有循环引用,这不会失败吗? (2认同)

smi*_*4fx 6

在Winston> 3中,您可以使用

logger.log('%o', { lol: 123 }')
Run Code Online (Sandbox Code Playgroud)

无论如何...无法接受我必须一直使用%o并提出以下简单解决方案:

const prettyJson = format.printf(info => {
  if (info.message.constructor === Object) {
    info.message = JSON.stringify(info.message, null, 4)
  }
  return `${info.level}: ${info.message}`
})

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.colorize(),
    format.prettyPrint(),
    format.splat(),
    format.simple(),
    prettyJson,
  ),
  transports: [
    new transports.Console({})
  ],
})
Run Code Online (Sandbox Code Playgroud)

所以这个记录器...

  logger.info({ hi: 123 })
Run Code Online (Sandbox Code Playgroud)

...在控制台中转换为此

info: {
    "hi": 123
}
Run Code Online (Sandbox Code Playgroud)