Javascript Winston日志文件在使用process.exit()时并不总是保存

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

我不能理解这个概念。。。在将日志文件保存到控制台和实际文件的程序上使用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回调--失败

  • 添加setTimeout-失败(process.exit似乎没有等待setTimeout-它无论如何都会退出程序)

  • 正如您在上面的示例中所看到的,使用async.parallel仍然不走运

  • 还有其他解决方案吗

    github上也存在同样的问题——但是还没有找到完全有效的解决方案

    来自:

    注意:这是用户Kegsay编写的问题相关部分的复制粘贴

    不管它值多少钱,您都可以绕过使用
    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)
      }
    });