1. 程式人生 > >log4net系列(三)--詳解RollingFileAppender

log4net系列(三)--詳解RollingFileAppender

這篇講講實際產品中最常用到的appender -- RollingFileAppender。

前面講過FileAppender,應該不難想到,如果一個系統的所有日誌都記在一個日誌檔案裡,那豈不是要撐爆了?所以我們真正使用的是RollingFileAppender,它基於時間生成一系列的日誌檔案,避免單個檔案過大的問題。下面是一個經典的RollingFileAppender配置:

  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="D:\WebTest\" />
    <param name="AppendToFile" value="true" />
    <param name="MaxSizeRollBackups" value="10" />
    <param name="MaximumFileSize" value="10MB" />
    <param name="StaticLogFileName" value="false" />
    <param name="DatePattern" value="yyyy-MM-dd'.txt'" />
    <param name="RollingStyle" value="Composite" />
    <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %-5p %c [%M] - Line %L:%m%n" />
    </layout>
  </appender>

我們從需求的角度反向分析這些配置的細節。

1. 我們的日誌要存到哪裡?

<param name="File" value="D:\WebTest\" />為我們指定了路徑。

2. 日誌檔案怎麼命名?

<param name="DatePattern" value="yyyy-MM-dd'.txt'" />指定檔名的日期格式。如果要加個".txt"的字尾,需要用單引號把它包起來。用&quot;也可以,即下面的寫法是等價的:<param name="DatePattern" value="yyyy-MM-dd&quot;.txt&quot;" />

<param name="StaticLogFileName" value="false" />指明檔名是變動的。這個設成true的話不能生成rolling的日誌檔案。

<param name="RollingStyle" value="Composite" />指明檔案的命名方式。"Composite"指檔名同時按size和date來命名,一般就用這個。還有其他3個取值:Once(每次程式啟動新生成一個)、Size、Date。當RollingStyle=Composite時,如果File引數設為"D:\WebTest\MyLog_" ,那麼檔名將是:"MyLog_2015-11-27.txt"。

3. 怎麼限定日誌檔案的大小?

<param name="MaximumFileSize" value="10MB" />限定每個日誌檔案不超過10M。

4. 日誌超過指定大小後會怎樣?

<param name="MaxSizeRollBackups" value="10" />表明,到達限制大小後會生成一個新檔案,如"2015-11-27.txt.1",依此類推,當生成"2015-11-27.txt.10"之後,再滿了就要回頭覆蓋第一個檔案了。

5. 日誌以什麼方式寫?

<param name="AppendToFile" value="true" />說明日誌以增量方式寫入。設成false就是覆蓋模式了。

6. 日誌內容的格式可以定義嗎?

<layout type="log4net.Layout.PatternLayout">
   <param name="ConversionPattern" value="%d [%t] %-5p %c [%M] - Line %L:%m%n" />
</layout>

layout標籤中的ConversionPattern引數可以定義每條訊息的格式,比如上面這個意思是:"時間 [執行緒id] 級別 類名 [方法名] - Line 行號:訊息內容+換行符",

例子:2015-11-27 19:18:25,320 [89] ERROR ASP.default_aspx [Page_Load] - Line 9:Hello World!

layout的引數詳解會單獨用一章來講。

7. 寫日誌會影響系統性能嗎?

寫日誌必然是會消耗一定資源的,而RollingFileAppender也不是執行緒安全的。為了減小log4net影響系統性能的嫌疑,我們加入lockingModel引數,使用FileAppender.MinimalLock來減少併發時發生死鎖的概率:

<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />

儘管如此,檔案的I/O始終是耗效能的,有沒有辦法快取一批日誌,然後一次性寫入檔案呢?BufferingForwardingAppender正是為此而生,我們下章再介紹如何使用它。