【发布时间】:2016-01-31 14:14:53
【问题描述】:
我只是用 Node.js 创建一些同步日志记录。
我相信 console.log 是同步的,但我希望使用 process.stdout,一个可写流。
这是我目前所拥有的:
var messages = [];
var okToWrite = true;
process.stdout.on('finish', function () {
okToWrite = true;
if (messages.length > 0) {
runnerLog(messages.pop());
}
});
module.exports = function runnerLog(data) {
if (okToWrite) {
okToWrite = false;
process.stdout.write(data);
process.stdout.end();
}
else {
messages.push(data);
}
};
问题是完成事件从未被触发,我也尝试过监听 drain 事件,但似乎也没有被触发。致电process.stdout.end() 似乎只是引起问题。我应该打电话给process.stdout.flush()?
我不确定我是否需要同步日志记录,但无论哪种方式,这段代码都不会锁定事件循环,因为我正在使用异步 I/O 并且不等待任何东西等。这一切都发生了。
从 Node.js 进程的文档中,看起来调用 end() 会抛出并且完成永远不会被调用:
https://nodejs.org/api/process.html#process_process_stdout
所以也许我应该使用除 process.stdout 之外的其他可写流并将其通过管道传输到 process.stdout?不知道。
【问题讨论】:
-
也许我理解错了,但是node进程完成时不是调用process.stdout.on('finish')吗?为什么你只想在最后记录?如果出现问题,最好立即获得迄今为止发送的日志。还是我错过了什么?
-
不,我认为在刷新流时会调用 process.stdout 完成事件,我还读到该事件被称为排水,所以我很困惑。这是一个长期运行的过程,我希望这项工作独立于事件循环关闭。
-
根据文档,当
close被调用在所有数据都已经flushed之后触发finish- 所以,@Gavriel 是正确的 -
hmmm 但是文档说 process.stdout 永远不会触发完成事件,请参阅帖子底部的链接
-
如果我理解正确,您想存储所有消息并仅在最后显示它们吗?如果是这样,请仅在此时收听
process.on('exit')并将messages写入标准输出。如果您不关心实时日志记录,最好将消息流式传输到文件中,这将是异步且快速的。
标签: javascript node.js