2014-07-23 50 views
0

我有一個簡單的日誌記錄工具日誌數據寫入到磁盤,它的工作原理是這樣的:外部修改文件打破了Node.js的可寫流

  1. 使用fs.createWriteStream使用標記來創建可寫流'a'用於追加。這會創建或打開文件以供我將數據寫入。
  2. 使用writeStream.write()將數據寫入我的日誌文件。

這工作完全,除了在這兩種情況下:

  1. 我開,而我的應用程序運行日誌文件,改變一些東西,並保存日誌文件。
  2. 我在應用程序運行時刪除日誌文件。預期的行爲是重新創建文件並保持記錄。

在這兩種情況下,我仍然可以打電話writeStream.write()沒有錯誤。

檢查我的writeStream對象後,我要麼修改或應用程序運行時刪除日誌文件顯示writeStream.writable屬性爲true。每次我打電話writeStream.write()writelen財產增加,這導致我相信writeStream認爲一切都好,即使它不是。

我的問題:

  1. 爲什麼修改和保存我的日誌文件外引起writeStream.write()停止寫入數據到我的檔案?我如何解決它?
  2. 爲什麼從外部刪除我的日誌文件會導致writeStream.write()停止將數據寫入我的文件?我如何解決它?

回答

1

一切好的,就寫入流而言。當你刪除文件時,你實際上刪除了目錄中的一個條目,但是原始的inode沒有被刪除,並且你打開它的應用程序繼續寫入磁盤,只有你沒有指向它的指針(一個目錄入口),所以看不到。您會注意到可用磁盤空間不斷減少,這會告訴您事情確實已寫入。當應用程序關閉文件時,它是,然後刪除(因爲沒有引用指向它),在此時可用磁盤空間將再次增加。

您試圖做的標準做法是嚮應用程序發送信號(SIGHUPSIGUSR1),並在信號處理程序中關閉應用程序並重新打開文件。這被稱爲「日誌輪轉」。有許多節點程序包可爲你做這個,也可以爲實踐自己做:-)

+0

感謝擡起頭來!你能指出我在正確的方向指導如何發送信號? –

+1

取決於你從哪裏發送信號。如果命令行或shell腳本然後'kill -SIGHUP pid'。節點,Python,Ruby等有相同的庫函數。 –