我正在将节点作为 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 来解决这个问题,但我更愿意使用成熟的日志记录模块,而不是自己滚动。
是否可以打开一个无缓冲的写入流?或者还有其他方法可以解决这个问题吗?
这里的问题与缓冲区无关。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)