1. 程式人生 > >.NET日誌記錄之——log4net劃重點篇

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

復制 布局 acea void center 環境 需要 system 詳解

.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.config

log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(@"c:/log4net.config"));

</font>

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