Winston Logging - 单独的级别以单独的传输

Posted

技术标签:

【中文标题】Winston Logging - 单独的级别以单独的传输【英文标题】:Winston Logging - separate levels to separate Transports 【发布时间】:2014-07-20 03:11:31 【问题描述】:

我正在使用 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,但找不到答案。即使我创建了自定义级别,我怎么可能将每个传输限制为只有一个日志记录级别?

【问题讨论】:

无需使用自定义传输、多个记录器等;在 winston 3.0 中,您可以通过使用简单的格式函数作为不同传输的过滤器来实现此功能:***.com/a/56918394/4451284 【参考方案1】:

我已经在another post回复了这个问题:


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


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

https://github.com/winstonjs/winston/issues/614 https://github.com/winstonjs/winston/issues/812 https://github.com/winstonjs/winston/pull/628 Winston Logging - separate levels to separate Transports

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

有一个类似的问题,这就是我想出的。这可以通过将日志函数设置为空函数来完成。这是我修改的一些代码,它做了类似的事情。此代码采用 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 () 
       

【讨论】:

以上是关于Winston Logging - 单独的级别以单独的传输的主要内容,如果未能解决你的问题,请参考以下文章

Winston:了解日志记录级别

如何在 Winston/Node.js 中设置日志级别

Node.js - 记录 / 使用 morgan 和 winston

如何更改船长 - 日志级别

17.3.12---logging日志模块level配置操作

如何将 Winston 限制为每个日志文件只有 1 个文件描述符