5

我正在使用 Winston 使用 2 种不同的传输方式进行日志记录 - 文件和 MongoDB。我已将 File 的级别设置为“INFO”,将 MongoDB 的级别设置为“ERROR”。如果我现在登录,

log.info('some info...');
log.warn('some Warning...');
log.error('some error...');

所有这些都会进入日志文件,只有错误会进入数据库。我只希望信息消息进入文件,而不是其他消息。

我了解 Winston 中的系统日志级别,并且只有 Error 进入 MongoDB,因为它是最高级别。由于 INFO 是较低级别,因此任何具有 INFO 或更高级别的日志都会进入文件(根据我的记录器定义)

我已阅读here,但找不到答案。即使我创建了自定义级别,我怎么可能将每个传输限制为只有一个日志记录级别?

4

3 回答 3

3

我已经在另一篇文章中回答了这个问题:


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


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

于 2017-08-10T15:51:46.133 回答
0

有一个类似的问题,这就是我想出的。这可以通过将日志函数设置为空函数来完成。这是我修改的一些代码,它做了类似的事情。此代码采用 customSilenceLevelLow 和 customSilenceLevelHigh,任何值低于或等于 customSilenceLevelLow 的日志函数都设置为空函数,任何值高于或等于 customSilenceLevelHigh 的日志函数都设置为空函数

所以在这段代码中,只有 info、info2 和 info3 级别的日志被记录到控制台。其余的没有。

注意:我没有测试这些更改,因此可能存在一些语法错误,但逻辑应该是好的。

winston = require("winston") 

var levels = {levels: {
    debug: 0,
    debug2: 1,
    debug3: 2,
    verbose: 3,
    verbose2: 4,
    verbose3: 5,
    info: 6,
    info2: 7,
    info3: 8,
    silly: 9,   
    warn: 10,
    error: 11
},
colors: {
    debug: "blue",
    debug2: "cyan",
    debug3: "grey",
    verbose: "cyan",
    verbose2: "magenta",
    verbose3: "blue",
    info: "green",
    info2: "magenta",
    info3: "grey",
    silly: "green", 
    warn: "yellow",
    error: "red"
}}

//needed so that new levels and colors are recognized       
winston.setLevels(levels.levels)
winston.addColors(levels.colors);

//add color to log text
winston.default.transports.console.colorize = true
winston.default.transports.console.prettyPrint = true

//false is default silences transport
winston.default.transports.console.silent = false

winston.default.transports.console.level = "debug"

var customSilenceLevelLow = "info"
var customSilenceLevelHigh = "info3"

for (var k in levels.levels) {

    if (levels.levels[k] <= levels.levels[customSilenceLevelLow] || levels.levels[k] >= levels.levels[customSilenceLevelHigh]) {

        //create an empty function to silence logs
        winston[k] = function () {}
    }   
}
于 2015-03-04T23:59:35.913 回答
0

看到这个答案。我为 winston 编写了一个包装器,它涵盖了基本的 api。它需要扩展以记录元数据,但除此之外它是一个好的开始。当然,您必须根据您的 MongoDB 需求进行调整。

于 2014-06-10T14:21:28.540 回答