Log4net學習系列(一)——Log4net的基礎知識學習
今天把Log4net日誌記錄做了封裝,作為一個公共的類庫。記錄一下應該注意的地方。先了解一下log4net的理論知識。
一、log4net是什麼?
log4net庫是Apache log4j框架在Microsoft .NET平臺的實現,是一個幫助程式設計師將日誌資訊輸出到各種目標(控制檯、檔案、資料庫等)的工具。 log4net是 Apache軟體基金會Apache Logging Services工程的一部分。Apache日誌服務工程致力於為程式除錯和審計提供跨語言的日誌服務。 二、log4net特徵- 支援多數框架
- 可輸出日誌到多種目標
- 層級日誌體系
- 可使用XML配置
- 可動態配置
- 記錄上下文資訊
- 被檢驗過的體系
- 模組化和可擴充套件化設計
- 靈活、高效能
三、Log4Net的結構
Log4Net有四種主要的元件,分別是Logger(記錄器),Repository(庫),Appender(附著器),以及 Layout(佈局)。
1、Logger記錄器
(1)Logger記錄器:Logger是應用程式需要互動的主要元件,它用來產生日誌訊息。產生的日誌訊息並不直接顯示,還要預先經過Layout的格式化處理後才會輸出。
Logger提供了多種方式來記錄一個日誌訊息,你可以在你的應用程式裡建立多個Logger,每個例項化的Logger物件都被log4net框架作為命名實體(named entity)來維護。這意味著為了重用Logger物件,你不必將它在不同的類或物件間傳遞,只需要用它的名字為引數呼叫就可以了。log4net框架使用繼承體系,繼承體系類似於.NET中的名字空間。也就是說,如果有兩個logger,分別被定義為a.b.c和a.b,那麼我們說a.b是a.b.c的祖先。每一個logger都繼承了祖先的屬性。
(2)日誌的級別:ERROR、DEBUG、WARN、INFO、FATAL
2、Repository庫
Repository主要用於負責日誌物件組織結構的維護。在log4net的以前版本中,框架僅支援分等級的組織結構(hierarchical organization)。這種等級結構本質上是庫的一個實現,並且定義在log4net.Repository.Hierarchy 名字空間中。要實現一個Repository,需要實現log4net.Repository.ILoggerRepository 介面。但是通常並不是直接實現該介面,而是以log4net.Repository.LoggerRepositorySkeleton為基類繼承。體系庫 (hierarchical repository )則由log4net.Repository.Hierarchy.Hierarchy類實現。如果你是個log4net框架的使用者,而非擴充套件者,那麼你幾乎不會在你的程式碼裡用到Repository的類。相反的,你需要用到LogManager類來自動管理庫和日誌物件。
3、Log4Net Appender(附著器)
一個好的日誌框架應該能夠產生多目的地的輸出。比如說輸出到控制檯或儲存到一個日誌檔案。log4net 能夠很好的滿足這些要求。它使用一個叫做Appender的元件來定義輸出介質。正如名字所示,這些元件把它們附加到Logger日誌元件上並將輸出傳遞到輸出流中。你可以把多個Appender元件附加到一個日誌物件上。
Appender和root經常搭配使用
appender:決定日誌輸出的方式(可設定多個節點,如對INFO,ERROR等設定不同的輸出方式)。
主要包括已下幾種:
1 AnsiColorTerminalAppender:在ANSI 視窗終端寫下高亮度的日誌事件。
2 AspNetTraceAppender:能用asp.net中Trace的方式檢視記錄的日誌。
3 BufferingForwardingAppender:在輸出到子Appenders之前先快取日誌事件。
4 ConsoleAppender:將日誌輸出到控制檯。
5 EventLogAppender:將日誌寫到Windows Event Log.
6 FileAppender:將日誌寫到檔案中。
7 LocalSyslogAppender:將日誌寫到local syslog service (僅用於UNIX環境下).
8 MemoryAppender:將日誌存到記憶體緩衝區。
9 NetSendAppender:將日誌輸出到Windows Messenger service.這些日誌資訊將在使用者終端的對話方塊中顯示。
10 RemoteSyslogAppender:通過UDP網路協議將日誌寫到Remote syslog service。
11 RemotingAppender:通過.NET Remoting將日誌寫到遠端接收端。
12 RollingFileAppender:將日誌以回滾檔案的形式寫到檔案中。(例項程式碼中使用的是此型別)
13 SmtpAppender:將日誌寫到郵件中。
14 TraceAppender:將日誌寫到.NET trace 系統。
15 UdpAppender:將日誌connectionless UDP datagrams的形式送到遠端宿主或以UdpClient的形式廣播。
從上面提供的方式中可以看出能輸出檔案、控制檯、Windows事件日誌和資料庫。這個可根據實際情況選擇。
<appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender"> ... </appender>
這裡配置的name(“Log4Net_INFO”)會在定義日誌的輸出媒介中使用到。name可任意設定。
root的配置說明 。
root:對設定輸出的方式進行指定。
<root> <!--批定DEBUG輸出的檔案形式記錄日誌--> <level value="DEBUG"/> <appender-ref ref="Log4Net_ERROR" /> <!--批定INFO輸出的檔案形式記錄日誌--> <level value="INFO"/> <appender-ref ref="Log4Net_INFO" /> </root>
4、Appender Filters過濾器
一個Appender物件預設地將所有的日誌事件傳遞到輸出流。Appender的過濾器(Appender Filters) 可以按照不同的標準過濾日誌事件。在log4net.Filter的名字空間下已經有幾個預定義的過濾器。使用這些過濾器,你可以按照日誌級別範圍過濾日誌事件,或者按照某個特殊的字串進行過濾。
過濾器通常有以下幾種:
-
- DenyAllFilter 阻止所有的日誌事件被記錄
- LevelMatchFilter 只有指定等級的日誌事件才被記錄
- LevelRangeFilter 日誌等級在指定範圍內的事件才被記錄
- LoggerMatchFilter 與Logger名稱匹配,才記錄
- PropertyFilter 訊息匹配指定的屬性值時才被記錄
- StringMathFilter 訊息匹配指定的字串才被記錄
5、Layout佈局
Layout 元件用於向用戶顯示最後經過格式化的輸出資訊。輸出資訊可以以多種格式顯示,主要依賴於我們採用的Layout元件型別。可以是線性的或一個XML檔案。Layout元件和一個Appender元件一起工作。API幫助手冊中有關於不同Layout元件的列表。一個Appender物件,只能對應一個Layout物件。要實現你自己的Layout類,你需要從log4net.Layout.LayoutSkeleton類繼承,它實現了ILayout介面。
一個Appender只能有一個Layout。
最常用的Layout應該是經典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然後還有IRawLayout,XMLLayout等幾個,使用較少。Layout可以自己實現,需要從log4net.Layout.LayoutSkeleton類繼承,來輸出一些特殊需要的格式,在後面擴充套件時就重新實現了一個Layout。
- SimpleLayout簡單輸出格式,只輸出日誌級別與訊息內容。
- RawTimeStampLayout 用來格式化時間,在向資料庫輸出時會用到。樣式如“yyyy-MM-dd HH:mm:ss“
- ExceptionLayout需要給Logger的方法傳入Exception物件作為引數才起作用,否則就什麼也不輸出。輸出的時候會包含Message和Trace。
- PatterLayout使用最多的一個Layout,能輸出的資訊很多
四、簡單的Log4Net.config配置及說明
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--新增自定義節點:log4net type:解析類名,程式集名(log4net.dll)--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--定義輸出到檔案中--> <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender"> <!--定義檔案存放位置--> <file value="C:/log4net/"/> <!--是否追加到檔案,預設為true,通常無需設定--> <appendToFile value="true"/> <RollingStyle value="Date"/> <!--日期的格式,每天換一個檔案記錄,如不設定則永遠只記錄一天的日誌,需設定--> <DatePattern value="INFO_yyyyMMdd".log"" /> <!--日誌檔名是否為靜態--> <StaticLogFileName value="false"/> <!--多執行緒時採用最小鎖定--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--佈局(向用戶顯示最後經過格式化的輸出資訊)--> <layout type="log4net.Layout.PatternLayout"> <!-- %m(message):輸出的日誌訊息,如ILog.Debug(…)輸出的一條訊息 %n(new line):換行 %d(datetime):輸出當前語句執行的時刻 %r(run time):輸出程式從執行到執行到當前語句時消耗的毫秒數 %t(thread id):當前語句所在的執行緒ID %p(priority): 日誌的當前優先級別,即DEBUG、INFO、WARN…等 %c(class):當前日誌物件的名稱,例如: %L:輸出語句所在的行號 %F:輸出語句所在的檔名 %-數字:表示該項的最小長度,如果不夠,則用空格填充 --> <Header value="[Header] "/> <Footer value="[Footer] "/> <!--正文--> <ConversionPattern value="記錄時間:%date 執行緒ID:[%thread] 日誌級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" /> </layout> </appender> <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender"> <file value="C:/log4net/"/> <appendToFile value="true"/> <RollingStyle value="Date"/> <DatePattern value="ERROR_yyyyMMdd".log"" /> <StaticLogFileName value="false"/> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <Header value="[Header] "/> <Footer value="[Footer] "/> <!--正文--> <ConversionPattern value="記錄時間:%date 執行緒ID:[%thread] 日誌級別:%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" /> </layout> </appender> <root> <level value="DEBUG"/> <appender-ref ref="Log4Net_ERROR" /> <level value="INFO"/> <appender-ref ref="Log4Net_INFO" /> </root> </log4net> </configuration>