初步測試了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分鐘。