我有一个简单的日志记录工具可以将日志数据写入磁盘,它的工作原理如下:
- 使用
fs.createWriteStream
创建一个可写流,并使用标志“a”进行追加。这将创建或打开文件供我写入数据。 - 使用
writeStream.write()
将数据写入我的日志文件。
除了以下两种情况之外,这完全有效:
- 我在应用程序运行时打开日志文件,更改某些内容,然后保存日志文件。
- 我在应用程序运行时删除日志文件。预期的行为是重新创建文件并继续注销。
在这两种情况下,我仍然可以毫无错误地调用 writeStream.write()
。
在应用程序运行时修改或删除日志文件后检查我的 writeStream
对象,显示 writeStream.writable
属性为 true
。每次我调用 writeStream.write() 时,writelen 属性都会增加,这让我相信 writeStream 认为一切正常,即使它不是。
我的问题:
- 为什么在外部修改和保存我的日志文件会导致
writeStream.write()
停止向我的文件写入数据?我该如何修复它? - 为什么从外部删除我的日志文件会导致
writeStream.write()
停止向我的文件写入数据?我该如何修复它?
最佳答案
就写入流而言,一切都很好。当您删除文件时,您实际上删除了目录中的一个条目,但原始 inode 并未被删除,并且打开该文件的应用程序会继续写入磁盘,只是您没有指向它的指针(目录条目),所以看不到。您会注意到可用磁盘空间不断减少,这告诉您确实已写入内容。当应用程序关闭文件时,它会被删除(因为没有任何引用指向它),此时可用磁盘空间将再次增加。
您尝试执行的标准做法是发送信号(SIGHUP
或 SIGUSR1
到应用程序),并在信号处理程序中让应用程序关闭并重新打开文件。这称为“日志轮转”。有许多 Node 包可以为您执行此操作,或者您可以自己执行此操作以进行练习:-)
关于javascript - 外部修改文件会破坏 node.js 中的可写流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24919975/