如何让Winston每日文件旋转以登录到相应的级别文件

时间:2017-08-10 12:22:36

标签: node.js express winston

我已为我的应用程序定义了自定义级别。它们如下所示。

protected levels: Level = {
        "error": 0,
        "warn": 1,
        "info": 2,
        "debug": 3,
        "trace": 4
    };

我正在使用每日文件循环传输来获取每日登录单独的文件。

    const options: Object = {
        name: this.level,
        filename: logFilePath,
        dirname: WinstonLogAgent.DIR_LOG,
        datePattern: "yyyyMMdd.",
        prepend: true,
        level: this.level,
        levels: this.levels,
        maxsize: this.maxFileSize,
        maxFiles: this.maxFileCount,
        handleExceptions: true,
        humanReadableUnhandledException: true
    };

    this.transportInstance.push(new (winston.transports.DailyRotateFile)(options));

如果我将日志级别定义为'info',它将创建一个名为info.log的日志文件,并将记录级别'info','warn'和'error'(将忽略跟踪和调试)。< / p>

但我想要的行为是不同的。如果我指定级别为'info'并且我正在记录级别'info','warn'和'error',那么应该为每种类型的日志创建单独的文件。即'info'级别应记录到info.log并'warn'级别记录到warn.log。

我尝试过指定五种不同的每日文件旋转传输,每种都有唯一的级别。然后我发现的问题是有重复的日志条目。 例如,如果记录'错误'级别,它将记录到info.log,warn.log&amp;记录级别设置为info时的error.log。

我如何实现目标?

1 个答案:

答案 0 :(得分:2)

根据Winston的文档,默认行为是记录至少具有指定重要性即记录级别的所有消息。

  

Winston允许您在每个传输上定义级别属性,该属性指定传输应记录的最大级别的邮件。

但是有办法达到你的要求 我将尝试向您展示一些可能性,您可以选择最适合您的方法。

1。自定义传输(推荐):

您可以创建自定义传输并仅记录所需的级别 这是一个例子,只是为了给你一个想法:

let mainLogger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)(),
  ]
});

class CustomTransport extends winston.Transport {
  constructor(options) {
    super(options);
    this.name = 'customLogger';
    this.level = options && options.level || 'info';
    this.levelOnly = options && options.levelOnly;
    this.levels = options && options.levels || [];
  }

  log(level, msg, meta, callback) {
    if (!this.levelOnly || this.levels.indexOf(level) > -1) {
      mainLogger[level](msg, meta);
    }
    callback(null, true);
  }
}

winston.transports.CustomTransport = CustomTransport;

let myLogger = new winston.Logger({
  transports: [
    new (winston.transports.CustomTransport)({
      levelOnly: true,
      levels: ['info'],
    }),
  ]
});

myLogger.info('will be logged');
myLogger.warn('will NOT be logged');
myLogger.info('will be logged as well');

2。使用winston-levelonly

  

这是原始winston套餐的一个分支。叉子位于https://github.com/damianof/winston
  此版本添加了 levelOnly 选项,以使winston仅记录指定的级别。

最后,我想鼓励您阅读以下相关讨论: