Log,是紀錄系統狀態與事件的一種機制,可以協助開發人員找出程式問題,或幫助維運人員監控系統狀態,所以Log是開發一套系統不可或缺的一部份。通常Log最簡單的方式就是直接利用程式碼指令將訊息印出來或者寫出檔案。複雜一點的話可將Log模組化,讓Log模組自動運行紀錄系統訊息。Apache Logging Services提供開發人員一套Log的Library,log4N。這套Library讓開發人員不用花時間開發Log模組也能使用不會太簡單又不會太複雜的Log模組。這次就來看看.Net專用的log4N,log4net。
log4net的N其實代表的是程式語言,因為Apache Logging Services為許多程式語言提供Log的Library,有.Net, Java, PHP, Cxx...等,雖然語言不同,但使用的是同一種機制。
log4net主要由三個部分組成:
...
...
大概介紹完後,接下來就是簡單使用一樣,限量在範例中同時要寫出Console和File,所以用ConsoleAppender和RollingFileAppender。
範例程式碼:
Program.cs
App.config
執行結果:
看完了基本使用後,就可以在專案上套用基本的Log模組。當然,log4net還有許多更進階的用法,例如:客製化Appender。這就等限量遇到的時候再來分享吧。
參考來源:
Apache Logging Services - Apache log4net
log4net的N其實代表的是程式語言,因為Apache Logging Services為許多程式語言提供Log的Library,有.Net, Java, PHP, Cxx...等,雖然語言不同,但使用的是同一種機制。
log4net主要由三個部分組成:
- Logger:Log的實體。開發人員取得Logger便可以透過呼叫Logger的各種Level的方法寫入Log。
- Appender:即為Log輸出的目標。Appender接收到Logger的訊息,將訊息進行處理後輸出到目標位置,目標位置可為資料庫, Console, 檔案...等。
- Layout:Log訊息的輸出格式,開發人員設定好Layout後,Appender會依據Layout的格式將Log訊息格式化後輸出至目標位置。
Logger
Logger為log4net的主要核心,透過呼叫GetLogger的方法可以取得Logger的Instance,取得Instance後就可以呼叫Info, Debug, Warn, Error, Fatal方法來記錄各種層級的訊息。Log的層級由小到大依序為 Info < Debug < Warn < Error < Fatal,層級愈高代表訊息更重要。在取得Logger Instance之後要先載入設定才能使用,最簡單的方式就是使用BasicConfigurator.Configure()方法載入最基本的設定,用這個只能在Console印出訊息。如果要載入App.config或Web.config的設定時,就要使用XmlConfigurator.Configure(),這樣就可以載入在設定檔中各種設定,例如Appender的設定, Layout的設定...等。Appender
如果說Logger是核心的話,那Appender可以說是真正執行的工具,Logger決定由哪個Appender來寫訊息。Appender決定寫出訊息的目標位置, 輸出色彩...等。log4net預設提供了許多種類型的Appender,當然,如果覺得不適合的話也可以自己客製化一個Appender,以下限量列出幾個特別的Appender的功能:- ColorConsoleAppender:輸出至Console,可以設定訊息文字的顏色或背景顏色。
- FileAppender:輸出至檔案,將訊寫寫至本機端的檔案裡。
- RollingFileAppender:FileAppender的進階版,可以根據自訂規則寫出多個檔案。
- EventLogAppender:輸出至Windows Event Log,可以在Windows的事件檢視器上檢視。
- SmtpAppender:輸出至Email,輸出的訊息會發送至指定的Email。
- AdoNetAppender:輸出至資料庫,透過ADO.NET定義資料庫Table將訊息寫入資料庫。
...
Layout
Layout是屬於比較靜態的設定,他只負責決定訊息的格式,使用者可以客製化訊息格式,例如加入時間, Thread編號, 序號...等資訊。log4net也提供了幾種Layout的Pattern,例如:- PatternLayout:提供使用者可客製化的格式,使用方式類似C語言printf方法一樣,%表示參數名稱,例如:%level %thread %logger - %message%newline,PatternLayout為較常用的格式。
- SimpleLayout:提供簡單的訊息格式([level] - [message])。
- XmlLayout:將訊息轉換為XML格式,含有Logger相關資訊。
...
大概介紹完後,接下來就是簡單使用一樣,限量在範例中同時要寫出Console和File,所以用ConsoleAppender和RollingFileAppender。
範例程式碼:
Program.cs
using System; using log4net; using log4net.Config; namespace Log4netTest { class Program { static void Main(string[] args) { // 取得Logger(Logger以Program的Type Name命名) var log = LogManager.GetLogger(typeof(Program)); //BasicConfigurator.Configure(); // 因為要讀取從App.config讀取設定,所以使用XmlConfigurator XmlConfigurator.Configure(); for (var i = 0; i < 10; i++) { log.Info(i); log.Debug(i); } Console.ReadLine(); } } }
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!--要引用log4net 相關ConfigurationSection--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > <layout type="log4net.Layout.PatternLayout"> <!--訊息格式 EX: 2016-03-01 18:15:59,912 [10] INFO Log4netTest.Program - 9--> <conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" /> </layout> </appender> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <!--檔名設定為example.log--> <file value="example.log" /> <appendToFile value="true" /> <!--檔案最大容量--> <maximumFileSize value="100KB" /> <layout type="log4net.Layout.PatternLayout"> <!--印出 日期 Thread編號 層級 Logger名稱 訊息--> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <root> <!--Level為INFO的Log才會寫出--> <level value="INFO" /> <!--印到Console上--> <appender-ref ref="ConsoleAppender" /> <!--寫出至檔案--> <appender-ref ref="RollingFileAppender" /> </root> </log4net> </configuration>
執行結果:
Console輸出
檔案輸出
看完了基本使用後,就可以在專案上套用基本的Log模組。當然,log4net還有許多更進階的用法,例如:客製化Appender。這就等限量遇到的時候再來分享吧。
參考來源:
Apache Logging Services - Apache log4net
留言
張貼留言