一尘不染

Winston / Morgan日志记录避免重复输入

node.js

我刚刚实现了Winston Logging,它可以按预期工作,但是遇到了一些我找不到答案的问题。

据我所知,winston的工作方式是设置的日志级别,以及使用优先级以下的任何东西,例如出错时,它还将包括信息日志等。是否有一种创建特定日志级别的方法可以称之为HTTP还是db,我只将http或db事件记录到日志中,而它们并没有出现在合并的文件或控制台中?


阅读 318

收藏
2020-07-07

共1个答案

一尘不染

更好的解决方案是使用具有格式功能的单个记录器作为“级别过滤器”,以指定哪个传输记录哪个特定级别。这是解决方案(请注意,levelFilter可以很容易地扩展以接受一系列可接受的级别)。

关键见解是,如果info格式化程序链未返回任何对象,则不会记录任何内容。

const { createLogger, format, transports } = require('winston');

const levelFilter = (level) =>
  format((info, opts) => {
     if (info.level != level) { return false; }
      return info;
  })();

const logger = createLogger({
  transports: [
    new transports.Console({
        format: format.combine(
          levelFilter("info"),
          format.json()
        )
    }),
    new transports.File({
        filename: "test.log",
        format: format.combine(
          levelFilter("error"),
          format.json()
        )
    }),
  ]
});

// ONLY is logged to test.log
logger.log({
  level: 'error',
  message: 'abcd'
});

// ONLY is logged to console
logger.log({
  level: 'info',
  message: '1234'
});
2020-07-07