我有一個Python服務將日誌分發到文本文件。它每旋轉〜400KB就會旋轉它們。所以Python服務打開文件的句柄,我們稱之爲app.log。然後,它會立即將文件寫入文件並將其刷新到磁盤。當它達到一定的大小時,它關閉它的句柄,並將其移動到app.log.1並開始新的句柄app.log。閱讀循環日誌文件和文件鎖定
所以我不能改變這個服務,但我有一個C#應用程序將讀取這些日誌。我跑進3個場景:
- 如果我只是試着去閱讀那些那些使用
new FileStream(path, FileMode.Open);
日誌,它不會允許我爲Python的服務上有一個手柄。 - 如果我嘗試使用
new FileStream(path, FileMode.Open, FileAccess.Read);
打開它,它允許我讀取它,但是如果服務試圖旋轉日誌,它將無法如我的C#應用程序現在具有該文件的句柄。 - 如果我嘗試使用
new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Delete);
打開文件,我的Python服務在刪除文件時不會失敗,但是它將無法在app.log上創建新的句柄,因爲C#應用程序仍然會處理它。
我知道的唯一解決方案是使用Windows Shadow Copy(VSS)創建日誌的快照,然後讀取該快照,但這會非常昂貴,因爲我們需要查詢日誌每5分鐘一班。
而且,我不感興趣,讀了循環日誌,app.log.1,app.log.2等
記錄爲文本的Windows下的文件似乎是一個什麼樣的痛苦與所有的鎖定/手柄。有沒有人有任何建議?
所以在您的Python應用程序開始通過C#應用程序讀取舊的新的日誌文件的一半的情況下,你想要什麼發生?在轉移到新文件之前,C#應用程序是否應該繼續讀取舊文件的末尾?它是一個恥辱,你不能更新Python應用程序,因爲該編號方案是愚蠢的。 – 2014-12-12 12:34:48
最重要的是我們無法更新Python應用程序。 C#應用程序可以靜靜地忽略任何讀取失敗,它應該停止閱讀並允許Python應用程序旋轉日誌(因此移動文件並創建一個新的日誌)。 C#服務檢查日誌以知道Python應用程序基本上正在執行。 – jValdron 2014-12-12 12:56:58
請看便知這裏每週日誌輪換[https://stackoverflow.com/a/45028620/8288059](https://stackoverflow.com/a/45028620/8288059) – 2017-07-11 08:00:32