外部修改文件会破坏node.js中的可写流

时间:2014-07-23 20:07:15

标签: javascript node.js file stream

我有一个简单的日志工具来将日志数据写入磁盘,它的工作原理如下:

  1. 使用fs.createWriteStream创建可写流,使用标记'a'进行追加。这会创建或打开文件,以便我将数据写入。
  2. 使用writeStream.write()将数据写入我的日志文件。
  3. 这完全有效,除了在这两种情况下:

    1. 我在应用程序运行时打开日志文件,更改内容并保存日志文件。
    2. 我在应用程序运行时删除了日志文件。预期的行为是重新创建文件并继续记录。
    3. 在这两种情况下,我仍然可以在没有错误的情况下致电writeStream.write()

      在应用程序运行时修改或删除日志文件后检查我的writeStream对象会将writeStream.writable属性显示为true。每当我致电writeStream.write()时,writelen属性会增加,这会让我相信writeStream认为一切正常,即使不是。

      我的问题:

      1. 为什么在外部修改和保存我的日志文件导致writeStream.write()停止将数据写入我的文件?我该如何解决?
      2. 为什么在外部删除我的日志文件导致writeStream.write()停止将数据写入我的文件?我该如何解决?

1 个答案:

答案 0 :(得分:1)

所有 确定,就写入流而言。当您删除文件时,您实际上删除了目录中的条目,但原始的inode未被删除,并且打开它的应用程序会一直写入磁盘,只有您没有指向它的指针(一个目录),所以无法看到。您会注意到可用磁盘空间不断减少,这会告诉您事情确实已写入。当应用程序关闭文件时,然后被删除(因为没有任何引用指向它),此时可用磁盘空间将再次增加。

您尝试的标准做法是向应用程序发送信号(SIGHUPSIGUSR1),并在信号处理程序中关闭应用并重新打开该文件。这被称为"日志轮换"。有许多节点包可以为您执行此操作,或者您可以自己执行此操作: - )