【问题标题】:How to get Winston daily file rotate to log to corresponding level file如何让 Winston 每日文件轮换记录到相应级别的文件
【发布时间】:2018-01-18 16:44:50
【问题描述】:

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

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.log 的日志文件,并将记录级别“信息”、“警告”和“错误”(跟踪和调试将被忽略)。

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

我已经尝试指定五个不同的每日文件轮换传输,每个都有唯一的级别。然后我发现的问题是有重复的日志条目。 例如,如果正在记录“错误”级别,则当日志级别设置为 info 时,它将记录到 info.log、warn.log 和 error.log。

我怎样才能实现我的目标?

【问题讨论】:

    标签: node.js express winston


    【解决方案1】:

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

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

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


    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 只记录指定的级别。


    最后,我想鼓励您阅读这些相关讨论:

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 2013-08-13
      • 2018-03-25
      • 2021-11-01
      • 2017-01-31
      • 2015-12-19
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多