Node.js 崩溃时不会刷新缓冲区

P H*_*ans 2 node.js

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

var fs = require('fs');

var logStream = fs.createWriteStream('./nx3.log');
logStream.end('Goodbye world');
process.exit(0);
Run Code Online (Sandbox Code Playgroud)

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

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

lev*_*evi 5

这里的问题与缓冲区无关。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);
       });
   });
Run Code Online (Sandbox Code Playgroud)