Javascript Winston日志文件在使用process.exit()时并不总是保存
我不能理解这个概念。。。在将日志文件保存到控制台和实际文件的程序上使用process.exit()时,日志事件都会在控制台中打印出来,但只有第一个(或根本没有)保存到文件中。以下是该问题的快速演示: 在下面的代码中,创建了一个winston记录器。然后在numberScore函数中,我为数组中的每个数字创建一个日志,并在最后并行记录所有事件-只是一个演示Javascript Winston日志文件在使用process.exit()时并不总是保存,javascript,node.js,asynchronous,process,winston,Javascript,Node.js,Asynchronous,Process,Winston,我不能理解这个概念。。。在将日志文件保存到控制台和实际文件的程序上使用process.exit()时,日志事件都会在控制台中打印出来,但只有第一个(或根本没有)保存到文件中。以下是该问题的快速演示: 在下面的代码中,创建了一个winston记录器。然后在numberScore函数中,我为数组中的每个数字创建一个日志,并在最后并行记录所有事件-只是一个演示 var async = require('async') var winston = require('winston') var momen
var async = require('async')
var winston = require('winston')
var moment = require('moment')
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
timestamp: function () {
return moment().format('D/MM/YYYY HH:mm:ss:SSS')
},
colorize: true
}),
new (require('winston-daily-rotate-file'))({
filename: 'logs/-system.log',
datePattern: 'dd-MM-yyyy',
prepend: true,
json: false,
timestamp: function () {
return moment().format('D/MM/YYYY HH:mm:ss:SSS')
}
})
]
})
var values = [1,2,3,4,5]
var numbersScore = function(done) {
var array = []
array.push(function(callback) {
logger.info('test1')
callback()
})
values.forEach(function(number){
number += 1
console.log(number)
array.push(function(callback) {
logger.info('test2', number)
callback()
})
})
async.parallel(array, function(error, data){
console.log('done')
process.exit()
})
}
numbersScore()
上面的代码在运行时会在控制台中打印出来-这意味着一切都很好-但是在日志文件中没有保存任何内容
2
3
4
5
6
28/09/2016 10:57:45:911 - info: test1
28/09/2016 11:01:22:677 - info: Numbers are 2
28/09/2016 11:01:22:678 - info: Numbers are 3
28/09/2016 11:01:22:678 - info: Numbers are 4
28/09/2016 11:01:22:678 - info: Numbers are 5
28/09/2016 11:01:22:678 - info: Numbers are 6
done
注释掉process.exit()
后,日志文件将与所有必需的数据一起正确保存。然而。。。。在我的场景中,我需要process.exit()-那么解决方法是什么呢
我尝试过的:
setTimeout
,但您需要抓住底层\u流
:
// log then exit(1)
logger.error("The thing to log", function(err) {
var numFlushes = 0;
var numFlushed = 0;
Object.keys(logger.transports).forEach(function(k) {
if (logger.transports[k]._stream) {
numFlushes += 1;
logger.transports[k]._stream.once("finish", function() {
numFlushed += 1;
if (numFlushes === numFlushed) {
process.exit(1);
}
});
logger.transports[k]._stream.end();
}
});
if (numFlushes === 0) {
process.exit(1);
}
});
如上所述,仅使用回调函数不足以使其正确刷新到文件。这对我来说像个虫子
请注意,我实际上是在监听finish事件:而不是使用winston的flush或closed事件,因为这也不足以让它正确记录://尝试类似的方法,它对我有效(基于winston):
您链接到的github问题确实有Kegsay提出的解决方案。侦听内部
\u流
,并侦听完成
事件。我确实看到了这一点,但我不确定如何将其实现到我的代码中,记住process.exit()不是在日志中调用的-还有其他依赖于process.exit()运行的函数。所以这个解决方案不适用于meThis,它不能回答所问的问题。。。您已经在评论中发布了此消息
logger.on('logging', function (transport, level, msg, meta) {
if (msg == "equal your message" && transport.name == "file") {
var id = setInterval(function () {
//when it is done to write the file, it will enter the id condition
if (transport._stream._writableState.bufferedRequestCount==0) {
exitProcess(0);
}
},1000)
}
});