Я не понимаю эту концепцию ... при использовании process.exit() в программе, которая сохраняет файлы журнала на консоль и в фактический файл, все события журнала распечатываются в консоли, но только первый (или вообще ничего) не сохраняется в файле. Ниже приведена краткая демонстрация выпуска:Файлы журнала Winston не всегда сохраняются при использовании process.exit() - node js
В приведенном ниже коде создается winston logger. Затем в функции numberScore для каждого числа в массиве я создаю журнал, а в конце я регистрирую все события параллельно - просто демо!
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() - так что обходной путь?
То, что я пробовал:
Использование Winston обратного вызова - https://github.com/winstonjs/winston#events-and-callbacks-in-winston - не удается
Добавление SetTimeout - выходит из строя (process.exit, кажется, не ждать SetTimeout - при выходе из программа в любом случае)
Как вы можете видеть в примере выше, используя async.parallel, но все же не повезло
Любые другие решения для этого?
Эта же проблема открыта на github - https://github.com/winstonjs/winston/issues/228 - однако решение, которое полностью работает, пока не определено.
Вопрос о том, что вы связали с github, имеет обходное решение, предложенное Kegsay. Прослушивание внутреннего '_stream' и прослушивание события' finish'. – DrakaSAN