2016-09-28 2 views
2

Я не понимаю эту концепцию ... при использовании 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() - так что обходной путь?

То, что я пробовал:

  1. Использование Winston обратного вызова - https://github.com/winstonjs/winston#events-and-callbacks-in-winston - не удается

  2. Добавление SetTimeout - выходит из строя (process.exit, кажется, не ждать SetTimeout - при выходе из программа в любом случае)

  3. Как вы можете видеть в примере выше, используя async.parallel, но все же не повезло

Любые другие решения для этого?

Эта же проблема открыта на github - https://github.com/winstonjs/winston/issues/228 - однако решение, которое полностью работает, пока не определено.

+0

Вопрос о том, что вы связали с github, имеет обходное решение, предложенное Kegsay. Прослушивание внутреннего '_stream' и прослушивание события' finish'. – DrakaSAN

ответ

0

От github issue:

Примечание: Это копипаст из соответствующего раздела вопроса, написанного пользователем Kegsay.

Для чего это стоит, вы можете получить вокруг использования setTimeout но вы должны захватить лежащий в основе _stream:

// 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); 
    } 
}); 

Как уже упоминалось выше, использование только функции обратного вызова не является достаточным, чтобы получить его чтобы правильно очистить файл. Для меня это похоже на ошибку.

Обратите внимание, что я на самом деле прослушивает событие финишного: https://nodejs.org/api/stream.html#stream_event_finish, а не с помощью флеш Уинстона или закрытое событие, потому что слишком недостаточно, чтобы заставить его правильно войти:/

+0

Я видел, что, однако, я не уверен, как реализовать его в моем коде, имея в виду, что process.exit() не вызывается внутри журналов - выполняются другие функции, зависящие от process.exit(). Так что это решение не работает для меня –

+1

Это не дает ответа на заданный вопрос ... Вы уже разместили это в комментарии – deeveeABC

0

Попробуйте что-то вроде этого, он работал me (на основе Winston):

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) 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^