log4net 之配置文件解析

先看下基本的配置代碼
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="rollingFile" />
</root>

<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="log.txt" />
<param name="AppendToFile" value="false" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy.MM.dd" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
   <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
   <param name="Header" value=" ----------------------header-------------------------- " />
   <param name="Footer" value=" ----------------------footer-------------------------- " />
</layout>
</appender> 
<appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> 
   <layout type="log4net.Layout.PatternLayout,log4net">
      <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
   </layout>
</appender> 
<logger name="Log4NetTest.LogTest">
   <level value="DEBUG" />
   <appender-ref ref="rollingFile" />
   <appender-ref ref="coloredConsoleApp" />
   <appender-ref ref="SystemEvent" />
</logger>
</log4net>


log4net配置節的XSD層次如下


 

<log4net>
<root><level /><appender-ref ref="" /></root>
<appender name="" type="Appender的完全限定類名">
<param name="" value="" />
<layout type="log4net.Layout.PatternLayout,log4net">
   <param name="" value="" />
</layout>
</appender>
<logger>
<level value="" />
<appender-ref ref="" />
</logger>
log4net是log4net配置節的根標記


root標記定義一個根級別的記錄者,log4net的記錄者採用層級組織的, 每一個LOGGER(ROOT也是一個LOGGER,只不過,他是祖先而已,別的方面,跟其他LOGGER一樣),都可以定義Level
level定義記錄的日誌級別,就是說,你要記錄哪個級別以上的日誌,級別由高往低依次是:
None
Fatal
ERROR
WARN
DEBUG
INFO
ALL

級別的定義要注意,如果你定義DEBUG,那麼低於DEBUG級別以下的信息,將不會記入日誌,啥意思呢?就是說,就算你在程序裏,用log.info()來寫入一個日誌信息,可是你在配置中指定level爲DEBUG,由於INFO級別低於DEBUG,所以,不會被記入日誌.這樣的處理非常靈活

Logger還有一個配置就是appender-ref了,ref是參照的意思,log4net的架構非常有意思,可擴展性非常高非常值得借鑑,他分爲四個要素:
logger
appender
layout
filter

logger是負責日誌的記錄者
appender提供記錄的介質
layout負責把記入的內容格式化
filter負責把內容進行篩選

可以說,整個過程就是一個日誌流水線,每個成員負責其中的一個環節
logger發出記錄信息,appender接到信息,根據內部的layout配置對記錄信息格式化,根據filter決定此信息是否被過濾掉,最後,將其序列化

 

因此,logger的appender-ref就是定義說,LOGGER要找誰去將內容寫入磁盤,流或其他介質,因此,十分重要吧
既然是ref引用,那肯定要定義這個被引用的appender對象了呀

每個appender都代表了一個輸出介質
name屬性指定其名稱,type則是log4net.Appender命名空間的一個類的名稱,意思是,指定使用哪種介質
log4net支持的appender類型有十幾種,最常用的有rollingFileAppender,AdoNetAppender,EventLogAppender,FileAppender,分別把日誌記入文件,系統日誌和數據庫
除此之外,appender內的其他參數都用param標記,以key/value形式定義於其內
這裏有個小提示,每一個appender,log4net並沒有在文檔中提出他們需要哪些參數,那麼,我們怎麼知道呢?
原來,這些param的名稱,你可以直接查對應的appender類的屬性名即可,例如,使用EventLogAppender時,通過查看類的屬性,我們知道其有
LogName,ApplicationName屬性,那麼,意味着,你可以直接在這個APPENDER的param里加入以下內容:
<param name="LogName" value="Application" />
<param name="ApplicationName" value="log4netTest" />

定義了appender的NAME及TYPE屬性,以及使用param爲其指定參數後,一個appender就建立了,你可以使用他的名字在LOGGER的<appender-ref中去 引用它,那麼,引用它的LOGGER在寫入日誌時,就是寫到了APPENDER中定義的介質中去了
一個LOGGER可以引用多個APPENDER,其結果是,同一個日誌,被同時記錄到多個介質中去 ,便如,同時發郵件,寫入系統日誌,發送到遠程主機.不過,雖然可以這樣做,但是還是要小心,因爲,會對性能有一定的影響,除非你需要,否則,不要亂用此功能

 

另外,appender中可以定義可選的layout

layout的定義非常有必要,如果你不想將來看到你的日誌會感覺頭暈的話,雖然log4net幫你寫入日誌,但是,日誌信息的格式卻是我們使用者自行定義的layout的type參數指定使用哪個類的定義來格式化,常用的有XmlLayout,SimpleLayout,PatternLayout,這個當然要根據你的需要,以及你要產生的格式來選啦,如果你要輸出成XML文檔格式,你肯定不能用simplelayout吧


layout使用param以KEY/VALUE形式定義其參數
各個Layout類使用的參數當然不一樣啦,具體的,你可以去看各個Layout類的屬性
其中,PatternLayout可以使用ConversionPattern參數來指定一個格式化字符串
以及可以指定一個Header參數,做爲日誌開頭的字符串,Footer來指定結尾字符串
這裏有一個小技巧,日誌中開頭和結尾總想產生回車符吧,雖然logger在寫入一條日誌會自動回車,可是Header和FOOTER卻不會,咋辦?用/n/r嗎?(我從別人的BLOG上看到過)經實踐,/n/r會原樣定改日誌,根本不會轉換.其實,我們可以用XML實體呀,使用&#13;&#10;就可以在指定位置插入一個回車換行符了

最後,像log4net的文檔中說的那樣,如果你不想你的日誌文件變得很大,使讀寫的性能下降的話,建議你還是分級管理日誌,把粒度變小點,也就是說,除了定義ROOT外,最後,對每一個模塊或每一個實體,依據用途,目的,定義各自的LOGGER配置,這樣的好處是日誌被分散了,日誌文件增長就沒那麼快了.每一個LOGGER的結構跟ROOT是一模一樣的,這裏不再敘述了.像前面說的那樣,如果你相讓日誌產生層級關係,你可以跟他們的NAME屬性像C#中的namespace那樣命名就可以了
要說明的是,LOGGER的定義是非必須的,只是一種建議罷了,Log4net的配置中,除了必須定義一個ROOT和一個APPENDER外,其他的都是可選的

另一種配置log4net的方法,是在單獨的XML文件中配置,這個時候,只要把log4net標記中的內容複製過來就行了,不需要configSections

 

原文出處:http://blog.csdn.net/hu8hong9/archive/2008/08/20/2800036.aspx

發佈了60 篇原創文章 · 獲贊 8 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章