我正在使用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但无法找到答案。即使我创建自定义级别,如何才能将每个传输限制为仅一个日志级别?
答案 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允许您在每个传输上定义级别属性,该属性指定传输应记录的最大级别的邮件。
但是有办法达到你的要求 我将尝试向您展示一些可能性,您可以选择最适合您的方法。
您可以创建自定义传输并仅记录所需的级别 这是一个例子,只是为了给你一个想法:
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');
winston-levelonly
这是原始winston套餐的一个分支。叉子位于https://github.com/damianof/winston
此版本添加了 levelOnly 选项,以使winston仅记录指定的级别。
最后,我想鼓励您阅读以下相关讨论: