Winston文档中有streaming logs部分说明:
Streaming允许您从所选的日志中回传日志 运输。
并给出以下代码示例:
//
// Start at the end.
//
winston.stream({ start: -1 }).on('log', function(log) {
console.log(log);
});
我对此的解读是,添加的每条新日志消息都将输出到控制台。 {start: -1}
配置告诉流在文件末尾开始,因此只输出新的日志条目。我希望以下Node脚本会导致test.log
文件的每个现有行输出到控制台,然后每500ms输出一个新对象。
var winston = require('winston');
winston.add(winston.transports.File, {
filename: 'test.log'
});
winston.remove(winston.transports.Console);
winston.stream().on('log', function(log) {
console.log(log);
});
setInterval(function(){
winston.log('info', 'help');
}, 500);
我希望看到以下输出:
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:15.806Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.307Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.809Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:17.309Z"}
{"level":"info","message":"help","timestamp":"2013-12-10T05:56:48.316Z"}
实际发生的情况是日志记录按文件传输的方式工作(文件每500毫秒获取一个新的日志条目),但控制台没有输出。永远不会调用console.log(log)
行。
我是否遗漏了明显的东西,或者误解了温斯顿日志流的目的?
答案 0 :(得分:9)
我经历过你所描述的那种bugg。我的结论是,默认记录器var winston = require('winston')
不能与函数query
,stream
一起使用,也不能使用EventEmitter
,因此您可以使用winston.on('logging', function() {...})
。
您需要使用的解决方案是实例化您自己的记录器,如下所示:
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({ level: 'info' }),
new (winston.transports.File)({ filename: 'app.log' })
]
});
然后你做一些记录:
setInterval(function(){
logger.log('info', 'logging some stuff..');
}, 500);
然后您可以使用stream
logger.stream().on('log', function(log) {
console.log('>>> ', log);
});
我认为您误解了stream
函数,因为它不会动态传输日志条目,它只会流式传输您已记录的所有条目。
要将事件连接到记录器,可以使用记录器对象上的“logging”事件:
logger.on('logging', function (transport, level, msg, meta) {
// [msg] and [meta] have now been logged at [level] to [transport]
console.log("[%s] and [%s] have now been logged at [%s] to [%s]",
msg, JSON.stringify(meta), level, transport.name);
});
我不知道为什么默认记录器不支持这个,正如我在本文开头所说的那样,当使用query
或{时,我在async-library(依赖于winston)中出现错误{1}}使用默认记录器。