標籤: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>的子項目。
支援的屬性:
支援的子項目:
屬性 |
詳解 |
param |
0個或多個, 設定一些參數。 |
3.1.6 <filter>
過濾器,只能作為<appender>的子項目。
支援的屬性:
支援的子項目:
屬性 |
詳解 |
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劃重點篇