這是處理: 我有一個多進程系統(pre-fork模型,類似於apache)。所有進程都寫入相同的日誌文件(實際上是一個記錄請求和響應的二進制日誌文件,但不管)。旋轉日誌無需重新啓動,多個進程問題
我防止經由共享內存鎖定併發訪問日誌,並且當文件達到一定的大小注意到它首先通過滾動日誌的過程:
- 關閉文件。
- 重命名log.bin - > log.bin.1,log.bin.1 - > log.bin.2等等。
- 刪除日誌超出允許的最大日誌數。 (比如說,log.bin.10)
- 打開一個新的log.bin文件
的問題是,其他過程都不知情,並且在事實上繼續寫入舊的日誌文件(後來改名到log.bin.1)。
我能想到的幾個解決方案:
- 某種RPC的通知其它進程重新打開日誌(甚至可能是葛)。我不特別喜歡它。
- 進程通過打開的文件流檢查文件長度,並以某種方式檢測到文件已在其下重命名並重新打開log.bin文件。
這些在我看來都不是很優雅。
想法?建議?
我試圖根據打開文件(ftell/tellg)和磁盤上當前日誌文件的大小之間的長度差異來執行旋轉檢測。 這不是100%的防彈,但應該在這種情況下工作,不需要任何共享內存。 – 2010-07-22 09:32:39
你已經使用共享互斥共享內存,它只是一個整數,除了有一個100%的防彈:-)恕我直言,測試大小差異將隨機工作,並將頭痛的傾向。 – Doomsday 2010-07-22 09:43:11
是的,但它是一個簡單的boost :: interprocess :: file_lock。任何方式,我認爲這是最好的答案,因爲它是最有效的記錄和旋轉的結果。 – 2010-07-22 11:05:47