log4net性能小探

初步測試了Log4性能。Appender架構以下。html

通常客戶端,使用FileAppender,把Log記錄在本地磁盤。數據庫

<lockingModel type="log4net.Appender.FileAppender+InterProcessLock"/>

 lockingModel影響性能。有三種模式:ExclusiveLock,MinimalLock,InterProcessLock。架構

默認是ExclusiveLock,此時若程序打開且第一次寫Log後,Log文件就被鎖定,Log文件沒法刪除。併發

MinimalLock是最小鎖,速度很慢。由於每次都打開關閉文件。程序打開時,Log可實時刪除,證實確實最小化鎖文件。app

InterProcessLock,進程間鎖。速度不慢與ExclusiveLock類似。且提供進程間同步,內部使用了Mutex。性能

客戶端程序,若容許打開多個,則必須使用InterProcessLock鎖。若使用其餘兩種鎖,會出現併發問題。現象就是能出現怪異的文件目錄,這事Log4自身bug引發。好比目錄爲以下:\Logs\2015-12\2015-12-06-11.log,併發問題產生後,出現以下目錄:Logs\2015-12\2015-12-06-11.log2015-12\2015-12-06-11.log。若客戶端僅僅容許一個進程打開,則使用ExclusiveLock,速度最快。應該比MinimalLock快20X。測試

對於Web端,仍是使用ExclusiveLock便可,ASP.Net網站通常不會多進程寫Log。網站

但咱們追求性能時,但願使用BufferingAppenderSkeleton下的類。但測試發現了問題,比沒有Buffer的更慢。編碼

在此貼中有外國人描述了現象。http://stackoverflow.com/questions/11319319/log4net-bufferingforwardingappender-performance-issue。是因爲Buffer類型,要對每一個LogEvent數據Fix下一些易變的數據(log4net.Core.LoggingEvent.FixVolatileData方法很是耗時),但Fix什麼數據是Flag Enum類型,是可配置的。以爲<Fix value="12"/>  夠用,並且速度大大提高。spa

使用Buffer類型後,發現文件鎖lockingModel的影響變小,由於Buffer致使寫文件次數大大下降,即便使用MinimalLock鎖,性能影響也不大。

Buffer類型雖然對繁忙系統Log性能大大提高,但會對於較少Log系統的系統形成影響,由於寫Log不及時,可能好久也沒法寫入磁盤或數據庫。致使出現問題時,Log在內存,沒法查看Log。

給出以下配置,有些配置節多是冗餘,不是很嚴謹,本身用的。

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <appender name="LocalFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
    <!--日誌文件路徑,按文件大小方式輸出時在這裏指定文件名,而且前面的日誌按天在文件名後自動添加當天日期造成文件-->
    <param name="File" value="Logs\"/>
    <!--是否追加到文件-->
    <param name="AppendToFile" value="true"/>
    <!--ExclusiveLock,MinimalLock,InterProcessLock-->
    <lockingModel type="log4net.Appender.FileAppender+InterProcessLock"/>
    <!--Unicode編碼-->
    <Encoding value="UTF-8"/>
    <!--最多產生的日誌文件數,value="-1"爲不限文件數-->
    <param name="MaxSizeRollBackups" value="1000"/>
    <!--是否只寫到一個文件中-->
    <param name="StaticLogFileName" value="false"/>
    <!--按照何種方式產生多個日誌文件(日期[Date],文件大小[Size],混合[Composite])-->
    <param name="RollingStyle" value="Date"/>
    <!--按日期產生文件夾,文件名[在日期方式與混合方式下使用]-->
    <param name="DatePattern" value="yyyy-MM\\yyyy-MM-dd-HH'.log'"/>
    <!--每一個文件的大小。只在混合方式與文件大小方式下使用,超出大小的在文件名後自動增長1從新命名-->
    <param name="MaximumFileSize" value="50KB" />
    <!--記錄的格式。-->
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %-5p %c %n - %m%n"/>
    </layout>
  </appender>
  <appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender">
    <bufferSize value="512" />
    <appender-ref ref="LocalFileAppender" />
    <Fix value="12"/>    <!--Mdc:1;Ndc:2;Message:4;ThreadName:8;LocationInfo:16;UserName:32;Domain:64;Identity:128;Exception:256;Properties:512;None:0;All:268435455;Partial:844 http://stackoverflow.com/questions/11319319/log4net-bufferingforwardingappender-performance-issue-->
  </appender>
  <root>
    <level value="ALL" /> 
    <appender-ref ref="BufferingForwardingAppender" />
  </root>
</log4net>

 

另外發現,RollingStyle爲Date時,設置DatePattern到秒級別HH:mm:ss,並不是每秒一個Log文件。是由於,Log4的Roll探測精度默認爲1分鐘。並且最高時間精度是1分鐘。

相關文章
相關標籤/搜索