Node.js:Winston:我可以添加默认的元数据到所有的日志消息

我在Node.js中使用Winston进行日志logging。 我知道我可以单独添加元数据到每个日志消息,但是有没有一种方法来指定将被添加到每个日志消息(如应用程序名称)的默认元数据集,因为我不想每次指定它我需要发送日志消息。

有没有内置的方式来做到这一点,但你可以自己添加它 – 这是如何:

首先,像你一样设置你的logging器。 例如:

var logger = new (winston.Logger)({ "exitOnError" : true, "transports" : [ new (winston.transports.Console)({ "colorize" : true, "level" : "silly", "silent" : false, "handleExceptions" : false }), ] }); 

然后重写log()方法(这总是通过level方法调用 – logger.foo()实际上调用logger.log('foo') 。)

 logger.log = function(){ var args = arguments; if(args[2]) args[3] = args[2]; args[2] = { "foo" : "bar" } winston.Logger.prototype.log.apply(this,args); } 

我上面所做的只是在logger.log()调用它,而是调用上面的方法,该方法添加元数据(在本例中为包含foo键的对象)。 然后从适当的上下文中调用winston的Logger.log方法。

上面的代码将在你创build的模块中,最下面的就是导出logging器:

module.exports = logger;

并导入logging器模块,而不是您的子类中的winston模块。

var logger = require('./logger.js');

希望有所帮助!

对于Winston v2(见评论)

现在有rewriters者是logging和正式的方式来做到这一点:

 logger.rewriters.push(function(level, msg, meta) { meta.app = 'myApp'; return meta; }); 

将一个属性app添加到每个元数据通过这个logging器。
您也可以在构buildlogging器时声明它:

 new (winston.Logger)({ level: config.log[file].level, rewriters: [ (level, msg, meta) => { meta.app = 'myApp'; return meta; } ], transports: [ /*your transports*/ ] }); 

输出更像log4j(s)的另一种select:

在控制台传输中有一个(当前未被logging的)“标签”属性,它将为输出添加一个标签(json或line):

 var _ = require('lodash'); var winston = require('winston'); var path = require('path'); var baseDir = path.resolve(__dirname, '..'); // SETUP WINSTON LOGGER var container = new winston.Container(); container.add("exception", { console: { handleExceptions: true, timestamp: true, label: "EXCEPTION", colorize: true } }); container.get("exception").exitOnError = false; var keys = []; module.exports = function(filename) { var label = path.relative(baseDir, filename); if (!_.contains(keys, label)) { container.add(label, { console: { handleExceptions: false, level: 'debug', timestamp: true, label: label, colorize: true } }); keys.push(label); } var logger = container.get(label); logger.exitOnError = false; return logger; }; 

而在其他模块需要这样的:

 var logger = require('./logger')(__filename); 

示例输出:

 2014-07-23T07:05:27.770Z - info: [config/config.js] ....... 

基于我在这个博客上阅读的内容,我发现使用util-extend更好的方法。 它将在所有情况下附加数据,我发现这对于捕获logger.info和logger.log(“info”,message)非常有用,并且不会覆盖其他参数。

 logger.log = function(){ var args = arguments; var level = args[0]; var newArgs = { foo: "bar", baz: "abc" }; var originalMeta = args[2] || {}; args[2] = extend(originalMeta, newArgs); winston.Logger.prototype.log.apply(this,args); }; 

将在控制台和日志中输出。