【问题标题】:atomically appending to a log file in nodejs原子地附加到nodejs中的日志文件
【发布时间】:2017-03-15 22:24:43
【问题描述】:

NodeJS 是异步的,例如,如果运行 Express 服务器,可能正在处理一个请求,记录它,然后开始处理另一个请求并尝试在第一个请求完成之前记录它。

由于这些是日志文件,因此不是简单的写入。即使写入是原子的,也可能另一个进程实际上会在原始进程即将写入的偏移处结束写入并最终覆盖。

有一个同步追加功能(fs.appendFile),但这需要我们延迟服务请求以等待日志文件写入完成,我仍然不确定这是否能保证原子追加。在确保原子性的同时在 NodeJS 中写入日志文件的最佳做法是什么?

【问题讨论】:

  • npm 上有几个原子写入包,仅供参考(不确定它们是否能解决您的问题)。 npmjs.com/search?q=atomic%20write
  • 在请求开始时生成一个 guid,并在每个日志条目开始时将其写出。这意味着在整个应用程序中传递上下文,但这并不难。在 Java 中,这称为映射诊断上下文 (MDC)。

标签: node.js


【解决方案1】:

一个可能正在处理一个请求,记录它,然后开始为另一个请求提供服务并尝试在第一个请求完成之前记录它。

各个write 调用将是原子的,因此只要您对每个请求进行单个日志write 调用,就不会损坏日志消息。但是,如果您在处理请求时记录多条消息,这些消息会在许多不同的并发请求之间交错,这是正常的。每条消息都是完整的,但它们按时间顺序在日志文件中,而不是按请求分组。没事儿。如果您想单独跟踪单个请求,则可以过滤请求 UUID。

即使写入是原子的,也许另一个进程实际上会在原始进程即将写入的偏移处结束写入并最终覆盖。

不允许多个进程写入同一个文件或日志。使用process.stdout,一切都会好起来的。或者,如果您真的想直接登录到文件系统,请使用排他锁机制。

在确保原子性的同时在 NodeJS 中写入日志文件的最佳做法是什么?

process.stdout,每个连贯的日志消息调用一个write。您可以让您的进程主管(systemd 或 upstart)为您编写日志,或使用日志管理器(例如 multilog、sysvlogd)并将您的标准输出通过管道传输给他们,让他们处理写入磁盘的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多