事情是這樣子的…我們有個專案裡面有使用 log4net v 1.2.11.0 ,在案子裡面是使用 RollingFileAppender , rollingStyle 是 Composite ,依日期時間及檔案大小來切檔,設定檔如下,
1 | <log4net debug="true"> |
這樣子的設定 log4net 會在 temp 目錄再依 年、月、日 建立目錄,然後產生 .0, .1 …的檔案如下圖,
這樣子的 log 在測試機都正常運作,唯獨在正式機卻會發生第 1 個檔案 .0 的 log 檔有正常產生,但 .1 的檔案卻一直被重覆的寫,導致要看 log 都常常看不到 (SystemRollingFileAppender)。雖然 maxSizeRollBackups 設定了 2000 ,但使終都只有 2 個檔案。 在我的 Local 測試也都沒什麼問題,用測試程式看它的 m_curSizeRollBackups 屬性也都正常,如下,
1 | // 如果不是透過 class access ,記得要在 Application_Start 呼叫 log4net.Config.XmlConfigurator.Configure(); 哦! |
如下, log4net 寫到了 2017-10-27-14-DB.log.6 這個檔案,
後來我將 IIS Express 的站台關掉再重新執行,結果 m_curSizeRollBackups 的值居然變成了 0 。如下,
1 | *** Name:SystemRollingFileAppender *** |
天呀! 我重現了問題了,當 系統重啟後, log4net 的 m_curSizeRollBackups 就會被重置成 0 。maybe 是 log4net 的 bug ,從 github 下載最新的 log4net v 2.0.9 來試,居然也是一樣的狀況 。
查看github logging-log4net的 source ,開啟 RollingFileAppender.cs 來看,從 DetermineCurSizeRollBackups 這個 Method
1 | private void DetermineCurSizeRollBackups() |
它會把 Log 目錄中的檔案傳給 InitializeRollBackups 這個 Method,如下,
1 | private void InitializeRollBackups(string baseFile, ArrayList arrayFiles) |