如何使“winston”日志记录库像“控制台.log一样工作



温斯顿图书馆非常适合运输和灵活性。我想使用它来允许配置级别和重定向到文件,但想重现控制台.log行为以进行格式化和遇到问题。

这是我到目前为止所拥有的:

const log = winston.createLogger({
  level: 'debug',
  format: format.combine(
    format.timestamp({format: 'YYYY-MM-DD HH:mm:ss.SSS'}),
    format.splat(),
    format.colorize(),
    format.printf(({level, message, label, timestamp}) => `${timestamp} ${label || '-'} ${level}: ${message}`),
  ),
  transports: [
    new winston.transports.Stream({
      stream: process.stderr,
      level: 'debug',
    })
  ],
});
log.info("Hello, %s", "Bob");   // Works: outputs "Hello, Bob"

但这不起作用:

log.info("Hello", "Bob");
log.info("Hello", 123, {someObj: 1});

我希望在splat()占用的对象之后的所有无关对象都添加,空格分隔,并最好使用util.inspect()转换为字符串。

回答我自己的问题。问题出在format.splat - 纯util.format提供了一个更简单,更预期的行为。将format.splat替换为此utilFormatter可以解决此问题:

const util = require('util');
function transform(info, opts) {
  const args = info[Symbol.for('splat')];
  if (args) { info.message = util.format(info.message, ...args); }
  return info;
}
function utilFormatter() { return {transform}; }

我问题中的示例如下所示:

const log = winston.createLogger({
  level: 'debug',
  format: format.combine(
    format.timestamp({format: 'YYYY-MM-DD HH:mm:ss.SSS'}),
    utilFormatter(),     // <-- this is what changed
    format.colorize(),
    format.printf(({level, message, label, timestamp}) => `${timestamp} ${label || '-'} ${level}: ${message}`),
  ),
  transports: [
    new winston.transports.Stream({
      stream: process.stderr,
      level: 'debug',
    })
  ],
});
log.info("Hello, %s", "Bob");          // Works: outputs "Hello, Bob"
log.info("Hello", "Bob");              // Works: outputs "Hello Bob"
log.info("Hello", 123, {someObj: 1});  // Works: outputs "Hello 123 { someObj: 1} "

我遇到了类似的问题,经过多次尝试和错误,我想我有一个您可能感兴趣的解决方案。正如我在上次更新中提到的,我们最终构建了自己的记录器。好吧,周末我把这个记录器发布到 npm,欢迎你查看。

它应该具有与console.log或多或少相同的输出。如果您发现任何不一致之处,请告诉我。

此外,它还具有多个传输,您甚至可以传递自定义传输,甚至可以"包装"控制台函数以快速集成到您的项目中。

示例代码:

const {createLogger,wrapConsole,unwrapConsole} = require('@r3wt/log');
const log = createLogger({log_level:'info',transports:['console','file']});
wrapConsole(log);//wraps the console globally with the log instance, making integration into large existing project less painful
// NOTE: only the following 4 functions are wrapped. 
console.log('hi!');
console.warn('warning');
console.error('error');
console.info('info');
unwrapConsole();//unwrap console globally

如果您有兴趣,可以在此处找到该库以及更多代码示例和基本文档,并且欢迎和鼓励具有功能和修复的 PR。 代码是 MIT 的,因此您可以自由分叉并创建自己的版本 :-(

祝你好运,我希望这有所帮助。

相关内容

最新更新