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

时间:2019-07-05 17:53:36

标签: node.js winston morgan

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

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

2 个答案:

答案 0 :(得分:4)

更好的解决方案是使用具有格式功能的单个记录器作为“级别过滤器”,以指定哪个传输记录哪个特定级别。这是解决方案(请注意,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'
});

答案 1 :(得分:0)

我可以使用您的文件名初始化一个带有参数的Winston。我使用类似的设置来记录独立的cron任务(我使用type参数代替filename,该参数在日志中用作前缀,因此可以在一个日志文件中识别多个cron任务中的问题)。希望您熟悉ES6语法。

utils / winston.js

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

const infoLogger = filename => createLogger({
    transports: [
        new transports.File({
            filename: 'info-' + filename,
            level: 'info'
        }),
        new transports.Console(),
    ],
        exitOnError: false
    });

const errorLogger = filename => createLogger({
    transports: [
        new transports.File({
            filename: 'error-' + filename,
            level: 'error'
        }),
        new transports.Console(),
    ],
        exitOnError: false
    });

export default filename => ({
    errorLogger: errorLogger(filename).error,
    infoLogger: infoLogger(filename).info
});

因此,在您的代码中,您可以从utils导入自定义Winston设置,并使用文件名对其进行初始化。请注意,我基本上只从winston errorLogger(filename).error导出错误函数,您可以按照您可以接受的方式对其进行修改

main.js

import logger from './utils/winston';
const { errorLogger, infoLogger } = logger('http.log');
errorLogger('some http fail'); // destination file => error-http.log
infoLogger('some http info'); // destination file => info-http.log