原子地附加到nodejs中的日志文件

时间:2016-11-02 14:43:48

标签: node.js

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

由于这些是日志文件,因此不是简单的写入。即使写入是原子的,也许另一个过程实际上会在原始过程即将到来的偏移量处写入,并且最终会覆盖。

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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

  

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

process.stdout,每个连贯的日志消息调用一次write。您可以让您的流程主管(systemd或upstart)为您编写日志,或使用日志管理器(如multilog,sysvlogd)并将stdout传送给他们,让他们处理写入磁盘。