Winston Logging - 单独的级别来分离传输

时间:2014-05-30 11:13:11

标签: node.js logging winston

我正在使用Winston记录2种不同的传输 - File和MongoDB。我已将File的级别设置为" INFO"而对于MongoDB而言," ERROR"。如果我现在登录,

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

所有这些都将转到LogFile,只有Error会转到DB。我只希望Info消息转到File,而不是其他。

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

我已阅读here但无法找到答案。即使我创建自定义级别,如何才能将每个传输限制为仅一个日志级别?

3 个答案:

答案 0 :(得分:0)

请参阅this回答。我为winston写了一个包装器,它涵盖了基本的api。它需要扩展以记录元数据,否则它是一个良好的开端。当然,你必须根据MongoDB的需要调整它。

答案 1 :(得分:0)

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

因此在此代码中,只有级别信息,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 () {}
    }   
}

答案 2 :(得分:0)

我在another post

中回答了这个问题

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

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