Log4Net五步走-----照葫蘆畫瓢般就會用log4net

本文不是教你全面瞭解log4net,本文只是希望教會你按步就班,照葫蘆畫瓢般就會用log4net
1,引入log4net.dll組件
2,建立一個配置文件
兩種方法,一種是在Web.Config或App.Config裏
加入以下配置節
<configSections>
 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
上面的配置節,複製就可以用了

加入log4net配置內容的定義,這個緊接着上面的內容定義在config文件裏就可以了,下面是一個範例:
<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="&#13;&#10;----------------------header--------------------------&#13;&#10;" />
  <param name="Footer" value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" />
 </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,A的名字叫loggerA,B的名字叫loggerA.B的話,那麼B就是A的兒子,B會自動繼承A的一些定義,例如LEVEL定義,appender-ref定義等,root就是總的logger,其餘定義的logger都是他的後代,都會繼承他的設置

包括ROOT在內的每一個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

3,在應用程序代碼中讀取配置
這一步非常簡單,你可以在應用程序集的assemblyInfo.cs文件中讀取log4net配置
對於WINFORM應用程序,你可以加入
[assembly:log4net.Config.DOMConfigurator()]或
[assembly:log4net.Config.XmlConfigurator()]
對於WEBFORM你可以加入
[assembly:log4net.Config.DOMConfigurator(ConfigFile="web.config",Watch=true)]

注意:如果使用NUNIT測試的朋友,要用生成後事件,copy "$(ProjectDir)app.config" "$(TargetPath).config"

4.在應用程序中獲取ILog對象
在需要使用LOGGER功能的類中,引入log4net空間,爲類加入靜態只讀成員(靜態的目的是隻用一個對象,只讀是防止誤改)
private static readonly ILog logger=LogManager.GetLogger(typeof(類))
這裏就可以獲取配置文件中與類名同名的LOGGER對象了

5,寫入日誌
很簡單 logger.Deub(寫入的內容)
其他的還有info,warn,error等,很容易理解的

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章