Log4Net五步走

來源:互聯網
上載者:User

標籤:winform   style   blog   color   使用   檔案   

本文不是教你全面瞭解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等,很容易理解的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.