1

我将节点作为 Windows 服务运行。该服务在启动时崩溃,因此我实现了一个日志系统,以发现当应用程序被迫退出时消息不会写入文件。我已经能够用下面的代码复制问题:

var fs = require('fs');

var logStream = fs.createWriteStream('./nx3.log');
logStream.end('Goodbye world');
process.exit(0);

没有任何内容写入 nx3.log,因为缓冲区不会刷新。我已经能够通过使用 fs.appendFileSync 解决这个问题,但我更愿意使用成熟的日志记录模块而不是自己滚动。

是否可以打开无缓冲的写入流?或者其他方式解决这个问题?

4

2 回答 2

4

这里的问题与缓冲区无关。FS writeableStream 异步执行写入。所以process.exit不等待logSteam.end执行写入,而是立即退出。

您可以做的是监听uncaughtException事件,并在那里执行您的日志记录。如果为此异常添加了侦听器,则不会发生默认操作(即打印堆栈跟踪并退出)。

process.on('uncaughtException', function (err) {
       logStream.end(err, function() {
           // write has completed, now we can exit
           process.exit(0);
       });
   });
于 2013-10-23T16:52:30.180 回答
0

注意,回调end()正在监听finish事件,这并不意味着缓冲区已被刷新到输出(例如磁盘或网络)。

那么,end()

  1. 发射finish
  2. 刷新数据
  3. 发射end

end因此,请务必从流中收听事件,例如以下示例:

process.on('uncaughtException', function (err) {
  // Use logStream to log what you want
  logStream.write(err);

  // Exit process only after flushing data
  logStream.writeStream.once('end', () => process.exit(1));
  logStream.end();
});

来源:https ://nodejs.org/api/stream.html#stream_events_finish_and_end

于 2019-07-26T14:06:29.697 回答