工作環境有些祖傳專案是用 log4net 寫 Log (後來的專案大多以 NLog 為主 參考 ),前人慣用 RollingFileAppender 的兩種設定方式,第一種是固定檔名,依指定大小分檔(rollingStyle="Size"),舊檔附加 .1、.2 順序編號,類似這樣:
註:超過上限時會寫完最後一筆,故不會剛好是設定大小

另一種是時間跟大小組合模式(rollingStyle="Compsite"),目前的 Log 檔案固定,換日時檔名加上 yyyyMMdd,另起新檔,若檔名超過大小上限,會分檔加上 .1、.2:

第一種做法每個檔涵蓋的期間不同且檔名看不出日期,要查特定時間的 Log 很不方便;第二種則是日期串接在 .txt 後方讓副檔名變得不可識別,而依大小切檔有點多餘,變成同一天的資料分散在多個檔,徒增查找麻煩。

過去秉持「If it works, don't touch it.」,就這麼運轉多年,最近剛好有機會整頓,就花了點時間看了 log4net 設定方式,讓它與其他程式慣用的 NLog 分檔規則一致:以日期為檔名存成 yyyyMMdd.txt (必要時以月分資料夾),一天一檔。

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="D:\\Logs\\MyApp\\"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value="yyyyMM\\yyyyMMdd'.txt'"/>
    <staticLogFileName value="false" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d [%t] %-5p %c [%x] - %m%n"/>
    </layout>
</appender>

整理檔名規則相關設定的意義:參考

  1. file 檔案路徑,可以是資料夾路徑,也可能細到檔名。
    若是傳統以大小分檔,可能寫成 x:\log-path\file-name.log,滿了再把舊檔更名成 file-name.log.1、file-name.log.2。
    若檔名會依日期跳動,這裡只給資料夾路徑,後面再用 datePattern 指定細節
  2. appendToFile 幾乎都會設成 true,否則檔案只記最後一個事件,有新的就覆寫
  3. rollingStyle 有四個選項 Once 每次程式啟動換新檔、Size 檔案達到大小上限才另起新檔、Date 依據日期時間切換新檔、Composite 依據日期,但若大小滿了也換新檔
  4. dataPattern 依日期決定檔名的規則,可包含依日期變化的資料夾名稱,依年、月、日分資料夾,固定不變的部分用單引號包夾,如副檔名部分寫 '.txt'
  5. staticLogFileName 若要依日期動態決定檔名,要設 false
  6. 預設大小拆檔會在副檔名後方加 .1、.2,在 Winows 會變成不認得的副檔名(.txt.1、.log.2)無法當成文字檔直接開啟,較新版本支援 preserveLogFileNameExtension = true 可改為 .1.log 維持副檔名不變
  7. log4net 是上回讀取其他程式開啟中的檔案技巧的源頭,有個 lockingModel 設定,預設為 ExclusiveLock,改為 log4net.Appender.FileAppender+MinimalLock 即可減少檔案鎖定問題

Tips about how to configure log4net use date as filename.


Comments

Be the first to post a comment

Post a comment