【问题标题】:Synchronous logging with Node.js使用 Node.js 进行同步日志记录
【发布时间】: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


【解决方案1】:

似乎 process.stdout.write,至少在指向终端/控制台时已经是同步的。似乎不需要添加任何东西。此外,正如我的问题中所述,process.stdout 流似乎不会触发使我的原始同步日志设计成为可能所需的事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多