如何實現一個系統,其中多個Node.js進程使用fs.createWriteStream
寫入同一個文件,以便它們不覆蓋數據?它看起來像fs.createWriteStream的默認設置是該方法被調用時該文件被清除。我的目標是清除文件一次,然後讓所有其他後續作家只追加數據。fs.createWriteStream在多個進程中
我應該用fs.createWriteStream
然後fs.appendFile
?或者有沒有辦法爲每個進程打開流,而不僅僅是第一個進程打開文件?
如何實現一個系統,其中多個Node.js進程使用fs.createWriteStream
寫入同一個文件,以便它們不覆蓋數據?它看起來像fs.createWriteStream的默認設置是該方法被調用時該文件被清除。我的目標是清除文件一次,然後讓所有其他後續作家只追加數據。fs.createWriteStream在多個進程中
我應該用fs.createWriteStream
然後fs.appendFile
?或者有沒有辦法爲每個進程打開流,而不僅僅是第一個進程打開文件?
我應該使用fs.createWriteStream然後fs.appendFile嗎?
你也可以使用。
與fs.createWriteStream你必須改變標誌是這樣的:
fs.createWriteStream('your_file',{
flags: 'a+', // default is 'w' (just 'a' might be enough here, i'm not sure)
})
這應該創建文件,如果它不存在,或者如果它存在與寫訪問權限打開它,並設置指針結束。 (追加模式)
如何使用fs.appendFile
應該清楚,它幾乎相同。
現在多個進程訪問同一文件的問題。顯然,只有一個進程可以同時打開具有寫權限的同一文件。 因此,如果另一個進程具有寫入權限,則需要等待該文件被釋放。你可能需要一個庫。
這一個例子:https://www.npmjs.com/package/lockup
或者這一個:https://github.com/Perennials/mutex-node
,你還可以找到很多更這裏:https://www.npmjs.com/browse/keyword/lock
或在這裏:https://www.npmjs.com/browse/keyword/mutex
我還沒有嘗試過任何這些庫,但一個我張貼和其他幾個人應該做你需要的東西。
你是否考慮過使用中間人來委託日誌寫作?比如syslog,第三方日誌記錄服務,甚至是一個專門的節點進程,用於將傳入的日誌請求(例如通過udp或unix套接字或其他)寫入文件。 – mscdex
是的,謝謝,這是一個很好的觀察,其實我可能會這樣做。我認爲,對於每個子進程來說,直接傳送到文件會更高效;但是,那麼文件數據可能會損壞,數據亂序?因此,我將stderr(這是所討論的數據流)傳遞給單個父節點node.js進程,然後將這些數據寫入文件。作爲父進程的性能較差是瓶頸,但可能很好。 –