.NET日誌記錄之——log4net劃重點篇

來源:互聯網
上載者:User

標籤:domain   named   date   art   層級   udp   append   結構   ali   

.NET日誌記錄之——log4net劃重點篇1.概述

log4net是.Net下一個非常優秀的開源日誌記錄組件。log4net記錄日誌的功能非常強大。它可以將日誌分不同的等級,以不同的格式,輸出到不同的媒介。

2.Log4net的主要組成部分2.1 Appenders

Appenders用來定義日誌的輸出方式,即日誌要寫到那種介質上去。較常用的Log4net已經實現好了,直接在設定檔中調用即可,可參見上面設定檔例子;當然也可以自己寫一個,需要從log4net.Appender.AppenderSkeleton類繼承。它還可以通過配置Filters和Layout來實現日誌的過濾和輸出格式。

已經實現的輸出方式有:

AdoNetAppender 將日誌記錄到資料庫中。可以採用SQL和預存程序兩種方式。AnsiColorTerminalAppender 將日誌高亮輸出到ANSI終端。AspNetTraceAppender  能用asp.net中Trace的方式查看記錄的日誌。BufferingForwardingAppender 在輸出到子Appenders之前先緩衝日誌事件。ConsoleAppender 將日誌輸出到應用程式控制台。EventLogAppender 將日誌寫到Windows Event Log。FileAppender 將日誌輸出到檔案。ForwardingAppender 發送日誌事件到子Appenders。LocalSyslogAppender 將日誌寫到local syslog service (僅用於UNIX環境下)。MemoryAppender 將日誌存到記憶體緩衝區。NetSendAppender 將日誌輸出到Windows Messenger service.這些日誌資訊將在使用者終端的對話方塊中顯示。OutputDebugStringAppender 將日誌輸出到Debuger,如果程式沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,將忽略訊息。RemoteSyslogAppender 通過UDP網路通訊協定將日誌寫到Remote syslog service。RemotingAppender 通過.NET Remoting將日誌寫到遠程接收端。RollingFileAppender 將日誌以復原檔案的形式寫到檔案中。SmtpAppender 將日誌寫到郵件中。SmtpPickupDirAppender 將訊息以檔案的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發送它們。TelnetAppender 用戶端通過Telnet來接受日誌事件。TraceAppender 將日誌寫到.NET trace 系統。UdpAppender 將日誌以無串連UDP資料報的形式送到遠程宿主或用UdpClient的形式廣播。
2.2 Filters

使用過濾器可以過濾掉Appender輸出的內容。過濾器通常有以下幾種:

DenyAllFilter 阻止所有的日誌事件被記錄LevelMatchFilter 只有指定等級的日誌事件才被記錄LevelRangeFilter 日誌等級在指定範圍內的事件才被記錄LoggerMatchFilter 與Logger名稱匹配,才記錄PropertyFilter 訊息匹配指定的屬性值時才被記錄StringMathFilter 訊息匹配指定的字串才被記錄
2.3 Layouts

Layout用於控制Appender的輸出格式,可以是線性也可以是XML。

一個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。PatternLayout 使用最多的一個Layout,能輸出的資訊很多,使用方式可參見上面例子中的設定檔。PatterLayout的格式化字串見文後附註8.1。
2.4 Loggers

Logger是直接和應用程式互動的組件。Logger只是產生日誌,然後由它引用的Appender記錄到指定的媒介,並由Layout控制輸出格式。

Logger提供了多種方式來記錄一個日誌訊息,也可以有多個Logger同時存在。每個執行個體化的Logger對象對被log4net作為具名實體(Named Entity)來維護。log4net使用繼承體系,也就是說假如存在兩個Logger,名字分別為a.b.c和a.b。那麼a.b就是a.b.c的祖先。每個Logger都繼承了它祖先的屬性。所有的Logger都從Root繼承,Root本身也是一個Logger。

日誌的等級,它們由高到底分別為:

OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL 

高於等級設定值方法(如何設定參見“設定檔詳解”)都能寫入日誌, Off所有的寫入方法都不寫到日誌裡,ALL則相反。例如當我們設成Info時,logger.Debug就會被忽略而不寫入檔案,但是FATAL,ERROR,WARN,INFO會被寫入,因為他們等級高於INFO。

在具體寫日誌時,一般可以這樣理解日誌等級:

FATAL(致命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續運行下去的錯誤。例如,資料庫無法串連,系統出現死迴圈。ERROR(一般錯誤):記錄系統中出現的導致系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,資料欄位為空白,資料操作不可完成,操作出現異常等。WARN(警告):記錄系統中不影響系統繼續運行,但不符合系統運行正常條件,有可能引起系統錯誤的資訊。例如,記錄內容為空白,資料內容不正確等。INFO(一般資訊):記錄系統運行中應該讓使用者知道的基本資料。例如,服務開始運行,功能已經開戶等。DEBUG (調試資訊):記錄系統用於調試的一切資訊,內容或者是一些關鍵資料內容的輸出。

Logger實現的ILog介面,ILog定義了5個方法(Debug,Inof,Warn,Error,Fatal)分別對不同的日誌等級記錄日誌。這5個方法還有5個重載。以Debug為例說明一下,其它的和它差不多。

ILog中對Debug方法的定義如下:

void Debug(object message);void Debug(object message, Exception ex);

還有一個布爾屬性:

bool IsDebugEnabled { get; }

如果使用Debug(object message, Exception ex),則無論Layout中是否定義了%exception,預設配置下日誌都會輸出Exception。包括Exception的Message和Trace。如果使用Debug(object message),則日誌是不會輸出Exception。

最後還要說一個LogManager類,它用來管理所有的Logger。它的GetLogger靜態方法,可以獲得設定檔中相應的Logger:

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
2.5 Object Renders

它將告訴logger如何把一個對象轉化為一個字串記錄到日誌裡。(ILog中定義的介面接收的參數是Object,而不是String。)

例如你想把Orange對象記錄到日誌中,但此時logger只會調用Orange預設的ToString方法而已。所以要定義一個OrangeRender類實現log4net.ObjectRender.IObjectRender介面,然後註冊它(我們在本文中的擴充不使用這種方法,而是直接實現一個自訂的Layout)。這時logger就會知道如何把Orange記錄到日誌中了。

2.6 Repository

Repository主要用於日誌對象組織圖的維護。

3.設定檔詳解 3.1 設定檔構成

主要有兩大部分,一是申明一個名為“log4net“的自訂配置節,如下所示:

<configSections>    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /></configSections><log4net>    ...    ...    ...</log4net>

二是<log4net>節的具體配置,這是下面要重點說明的。

3.1.1 <log4net>

所有的配置都要在<log4net>元素裡定義。

支援的屬性:

屬性 詳解
debug 可選,取值是true或false,預設是false。設定為true,開啟log4net的內部調試。
update 可選,取值是Merge(合并)或Overwrite(覆蓋),預設值是Merge。設定為Overwrite,在提交配置的時候會重設已經配置過的庫。
threshold 可選,取值是repository(庫)中註冊的level,預設值是ALL。

支援的子項目:

屬性 詳解
appender 0或多個
logger 0或多個
renderer 0或多個
root 最多一個
param 0或多個
3.1.2 <root>

實際上就是一個根logger,所有其它logger都預設繼承它,如果設定檔裡沒有顯式定義,則架構使用根日誌中定義的屬性。root元素沒有屬性。

支援的子項目:

屬性 詳解
appender-ref 0個或多個,要引用的appender的名字。
level 最多一個。 只有在這個層級或之上的事件才會被記錄。
param 0個或多個, 設定一些參數。
3.1.3 <logger>

支援的屬性:

屬性 詳解
name 必須的,logger的名稱
additivity 可選,取值是true或false,預設值是true。設定為false時將阻止父logger中的appender。

支援的子項目:

屬性 詳解
appender-ref 0個或多個,要引用的appender的名字。
level 最多一個。 只有在這個層級或之上的事件才會被記錄。
param 0個或多個, 設定一些參數。
3.1.4 <appender>

定義日誌的輸出方式,只能作為 log4net 的子項目。name屬性必須唯一,type屬性必須指定。

支援的屬性:

屬性 詳解
name 必須的,Appender對象的名稱
type 必須的,Appender對象的輸出類型

支援的子項目:

屬性 詳解
appender-ref 0個或多個,允許此appender引用其他appender,並不是所以appender類型都支援。
filter 0個或多個,定義此app使用的過濾器。
layout 最多一個。定義appender使用的輸出格式。
param 0個或多個, 設定Appender類中對應的屬性的值。

實際上<appender>所能包含的子項目遠不止上面4個。

3.1.5 <layout>

布局,只能作為<appender>的子項目。

支援的屬性:

屬性 詳解
type 必須的,Layout的類型

支援的子項目:

屬性 詳解
param 0個或多個, 設定一些參數。
3.1.6 <filter>

過濾器,只能作為<appender>的子項目。

支援的屬性:

屬性 詳解
type 必須的,Filter的類型

支援的子項目:

屬性 詳解
param 0個或多個, 設定一些參數。
3.1.7 <param>

<param>元素可以是任何元素的子項目。

支援的屬性:

屬性 詳解
name 必須的,取值是父物件的參數名。
value 可選的,value和type中,必須有一個屬性被指定。value是一個能被轉化為參數值的字串。
type 可選的,value和type中,必須有一個屬性被指定。type是一個類型名,如果type不是在log4net程式集中定義的,就需要使用全名。

支援的子項目:

屬性 詳解
param 0個或多個, 設定一些參數。
4. 關聯設定檔

log4net預設關聯的是應用程式的設定檔App.config(BS程式是Web.config),可以使用程式集自訂屬性來進行設定。下面來介紹一下這個自訂屬性:

log4net.Config.XmlConifguratorAttribute

XmlConfiguratorAttribute有3個屬性:

ConfigFile: 設定檔的名字,檔案路徑相對於應用程式目錄

(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile屬性不能和ConfigFileExtension屬性一起使用。

ConfigFileExtension: 設定檔的副檔名,檔案路徑相對於應用程式的目錄。ConfigFileExtension屬性不能和ConfigFile屬性一起使用。

Watch: 如果將Watch屬性設定為true,就會監視設定檔。當設定檔發生變化的時候,就會重新載入。

如果ConfigFile和ConfigFileExtension都沒有設定,則使用應用程式的設定檔App.config(Web.config)。

可以在項目的AssemblyInfo.cs檔案裡添加以下的語句:

//監視預設的設定檔,App.config [assembly: log4net.Config.XmlConfigurator(Watch = true)]//使用設定檔log4net.config,不監視改變。注意log4net.config檔案的目錄,BS程式在網站目錄//下,CS則在應用程式啟動目錄下,如調試時在/bin/Debug下,一般將檔案屬性的檔案輸出目錄調為//始終複製即可[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]//使用設定檔log4net.config,不監視改變[assembly: log4net.Config.XmlConfigurator()]

也可以在Global.asax的Application_Start裡或者是Program.cs中的Main方法中添加,注意這裡一定是絕對路徑,如下所示:

//這是在BS程式下,使用自訂的設定檔log4net.config,使用Server.MapPath("~") + //@"/log4net.config”來取得路徑。/log4net.config為相對於網站的路徑// ConfigureAndWatch()相當於Configure(Watch = true)log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~") + @"/log4net.config"));
//這是在CS程式下,可以用以下方法獲得:string assemblyFilePath = Assembly.GetExecutingAssembly().Location;string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);string configFilePath = assemblyDirPath + " //log4net.config";log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(configFilePath));

或直接使用絕對路徑:

//使用自訂的設定檔,直接絕對路徑為:c:/log4net.configlog4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(@"c:/log4net.config"));

</font>

.NET日誌記錄之——log4net劃重點篇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.