簡體   English   中英

如何讓 `winston` 日志庫像 `console.log` 一樣工作?

[英]How to make `winston` logging library work like `console.log`?

winston庫非常適合傳輸和靈活性。 我想用它來允許配置級別和重定向到文件,但想重現 console.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提供了一種更簡單、更符合預期的行為。 用這個utilFormatter替換format.splat解決了這個問題:

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,所以你可以自由地 fork 並創建你自己的版本 :-)

祝你好運,我希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM