Javascript 如何使“winston”日志库像“console.log”一样工作?

Javascript 如何使“winston”日志库像“console.log”一样工作?,javascript,node.js,logging,winston,Javascript,Node.js,Logging,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.colo

该库非常适合运输和灵活性。我想使用它来允许配置级别和重定向到文件,但希望复制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()

转换成字符串。我遇到了一个类似的问题,经过多次尝试和错误后,我想我找到了一个您可能感兴趣的解决方案。正如我在上次更新中提到的,我们最终构建了自己的记录器。嗯,在周末我将这个日志发布到npm,欢迎您查看

它应该有或多或少相同的输出到
控制台。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的,因此您可以自由地派生并创建自己的版本:-)


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

回答我自己的问题。问题在于
格式。splat
——pure提供了一种更简单、更预期的行为。将
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} "
const log=winston.createLogger({
级别:“调试”,
格式:format.combine(
format.timestamp({format:'YYYY-MM-DD HH:MM:ss.SSS'}),
utilFormatter(),//`${timestamp}${label | |'-'}${level}:${message}`),
),
运输:[
新温斯顿运输公司({
流:process.stderr,
级别:“调试”,
})
],
});
log.info(“你好,%s”,“鲍勃”);//作品:输出“你好,鲍勃”
log.info(“你好”,“鲍勃”);//作品:输出“你好,鲍勃”
log.info(“你好”,123,{someObj:1});//作品:输出“Hello 123{someObj:1}”

您需要为
console const console=new winston.transports.console()提供另一个传输查看文档。我面临的唯一问题是
堆栈跟踪
被格式化为字符串,所以在终端上没有修饰。我的问题是关于额外参数的格式化,而不是关于传输。@DS。我是同舟共济的。你找到解决办法了吗?这个图书馆过去很好。编辑,我真的想出来了。因此,我将把我的解决方案留给这里的每个人。这是有效的:当我用我的示例中的两行代码尝试您的精确代码时,我得到的输出是:
info:Hello{“0”:“B”,“1”:“o”,“2”:“B”}
info:Hello{“someObj”:1}
,这非常糟糕(没有真正打印字符串,完全省略了数字)。这是温斯顿3.2.1。你怎么称呼它,能给我举个例子吗?此外,我还用我在项目中使用的最终解决方案更新了帖子。我想你可能误解了我的问题,这是关于调用
log.info('app running on port',3000)
(注意缺少“%d”),它可以与
console.log
和旧的winston一起使用,但不能与新的winston格式化程序一起使用。@DS。我的错。老实说,我们最终离开了温斯顿,开始写自己的日志。对不起,我帮不了你。@DS。我又做了一次尝试,并将我的作品发布给NPM。请让我知道输出和功能是否适合您的需要。错过这个案例
log.info({someObj:1})看看这个:它的地址:
console.log([{a:1}])