log4net按照不同的【LEVEL】級別輸出到不同文件


Log4net按照不同級別寫入多個日志文件

2012-02-08 15:06 by Fred-Xu, ... 閱讀, ... 評論, 收藏, 編輯

在一個Web應用項目中,我使用了Fluent NHibernate作為數據訪問組件,Log4net來做日志記錄。實際編碼中,主要使用了INFO和ERROR這兩個等級來記錄日志,如果按照以下Log4net配置:

<root>
<level value="ALL"/>
<appender-ref ref="RollingFile"/>
<appender-ref ref="RollingFileTracer"/>
</root>


log4net會把INFO和ERROR的日志記錄到同一個日志文件里,Fluent NHibernate的INFO日志會大量存在於該日志文件中,這樣一來對日后分析錯誤日志帶來非常之不便,所以就想能不能單獨把ERROR級的錯誤日志記錄到一個特定的日志文件里。

於是開始嘗試各種配置來實現這個需要,<root>標簽不支持多個<level>,也就沒法通過在<root>中配置多個不同級別的日志輸入,通過查閱Log4net文檔,找到了<Filter>這個標記,配置如下:

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!--http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%p %t] [%date{yyyy-MM-dd HH:mm:ss,fff}] %-5l - %m%n"/>
</layout>
</appender>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="App_Data/log.log"/>
<appendToFile value="true"/>
<maximumFileSize value="5000KB"/>
<maxSizeRollBackups value="500"/>
<CountDirection value="1"/>
<RollingStyle value="Size"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%p %t] [%date{yyyy-MM-dd HH:mm:ss,fff}] %-5logger - %m%n"/>
</layout>
</appender>
<appender name="RollingFileTracer" type="log4net.Appender.RollingFileAppender">
<file value="App_Data/Trace.log"/>
<appendToFile value="true"/>
<maximumFileSize value="5000KB"/>
<maxSizeRollBackups value="500"/>
<CountDirection value="1"/>
<RollingStyle value="Size"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%p] %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingFile"/>
<appender-ref ref="RollingFileTracer"/>
</root>
</log4net>

我們可以看到“RollingFileTracer”中我們通過Filter過濾,只記錄范圍為ERROR到FATAL,然后在<root>增加該appender,level設置為“ALL”記錄所有級別的日志。好了,配置完成,程序實現了記錄不同等級的錯誤信息到多個日志文件。

 

參考:http://stackoverflow.com/questions/1372435/configure-log4net-to-write-to-multiple-files

 
 
 

Logger hierarchy(層次級別)

 

Logger都是已經命名的實體。

 

Logger的名稱區分大小寫並遵循以下規則:

1、如果A logger的名稱如果是B logger名稱的前綴(通過“.”連接),則說A logger是B logger的祖父級。

2、如果A logger的名稱和B logger的名稱之間不存在其他的logger名稱,則A logger是B logger的父級。

        例子:A logger名稱為“Foo.Bar”,B logger名稱為“Foo.Bar.Baz”,A為B的父級。名稱為“System”的logger是名稱為“System.Text.StringBuilder”的祖父級。

Root logger位於logger層次級別中的頂級。

 

它有例外的三條規則:

1、Root logger總是存在的。

2、Root logger不能通過名稱或取。

3、Root logger 有一個默認的Level 值為 Debug。

 

Logger 可以通過log4net.LogManager類的靜態方法GetLogger獲取。

Level值:ALL/DEBUG/INFO/WARN/ERROR/FATAL/OFF

 

Level 繼承規則:如果一個logger沒有定義Level,它的Level值將從它的父級(定義了Level)繼承。

 

日志紀錄請求通過調用logger實例的輸出方法實現。

這些輸出方法有Debug,Info,Warn,Error和Fatal。

通過定義,輸出方法決定了日志紀錄請求的Level。

例如,log是一個logger實例,那么語句log.Info(“..”)的日志紀錄請求Level為INFO。 如果日志紀錄請求的Level比logger本身定義(或繼承)的Level高,則請求是可行的,否則不可行。

簡單規則:如果日志記錄請求的Level為L,logger本身定義(或繼承)Level為K,當L>=K時,日志紀錄請求是可行的。

 

Level級別:DEBUG <INFO<WARN<ERROR<FATAL

 

通過名稱,調用log4net.LogManager.GetLogger方法,可以獲取同一個logger的實例引用。

這樣在配置了一個logger后,不用在代碼中傳遞引用而可以獲取同一個logger的引用了。

與生物上的親子關系(父親總是先於孩子)基本相反,在log4net 里,logger可以被創建和配置成任何順序。

特別的是,一個父級logger可能比子級logger后實例化,但卻可以在子級中查找到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM