Я не могу понять эту концепцию ... при использовании process.exit () в программе, которая сохраняет файлы журнала в консоли и в фактический файл, все события журнала распечатываются в консоли, но только первый (или ни одного в все) сохраняются в файл. Вот краткая демонстрация проблемы:
В приведенном ниже коде создается регистратор Winston. Затем в функции 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 - однако полностью работающего решения пока не найдено.
_stream
и прослушивание событияfinish
. - person DrakaSAN   schedule 28.09.2016