.NET環境下log處理解決方案(Log4Net)
載自:http://blog.csdn.net/zyc21st/archive/2006/03/27/639820.aspx
1 實現目的
一個好的應用系統離不開log文件的支持,所以log文件的處理在應用系統的開發過程中是占很大比重的。log文件的處理方法有很多種,采用一種功能強大且方法簡單的處理方法,不但能保證log文件的輸出質量,更能大大縮短系統開發和維護的周期。本文介紹的.net環境下log文件處理解決方案,采用的是開源日志框架log4net。本文介紹的log4net基于log4net-1.2.0版本。
2 log4net概述
log4net是一個輔助應用系統輸出多種樣式log信息的日志框架,它是著名的log4j框架在.net環境下的實現,在實際應用中,可以采用和log4j類似的方法在.net環境下構建起一個功能強大的log處理系統。log4net和應用系統的結合不需要修改應用系統本身的代碼,它們之間的綁定非常簡單,并且log4net處理log信息是和應用系統同步的,其處理速度和輸出的多樣性也是其它任何log處理系統無法比擬的。log4net最有特色的地方是,它對log進行了分等級處理,這樣應用系統可以在實際運行環境下很簡單的輸出不同級別的log信息,幫助系統開發維護人員在最快的時間里得到最有用的系統log信息。
log4net處理log文件的方法是靈活多變的,它可以將log信息輸出不同的樣式和輸出到不同的地方,如控制臺(Console),文本文件,XML文件,以流的形式發送到其它地方(如數據庫),發送到電子郵件中,根據天數或者文件大小產生新的文件等等。并且開發人員可以根據自己的喜好格式化log輸出,如自由指定樣式,可以包含log級別與log信息,包含log時間、線程、類別等信息的樣式等等。
本文以最常見的log輸出形式:輸出到文本文件和數據庫作為范例來介紹log4net的使用方法。
3 log4net 主要結構分析
在使用log4net之前先了解log4net的結構是非常有必要的,下面簡要分析log4net結構中重要的幾個部分。
3.1 Logger Logger是應用程序與log4net交互的主要模塊,它也是log4net生成log的模塊。Logger主要負責得到log信息,得到log信息之后接下來的顯示log則是在Layout模塊中處理。
3.1.1 Logger的管理方式
Logger提供了多種方法用于記錄任何類型的log信息,可以在應用程序中使用多個Logger實例,而把它們的維護工作交給log4net框架作為“命名實體(Named Entity)”進行維護。這就意味著,不再需要將應用程序中生成的Logger實例作為參數在應用程序中傳遞,以便應用程序中的其它模塊能使用該實例。唯一需要做的就是通過Logger的命名來調用它。
目前,log4net使用類似.net命名空間的方式管理命名實體。例如,有兩個Logger,分別定義為logger.First以及logger.First.One。那么這兩個是不同的Logger,而且logger.First是logger.First.One的祖先,同時logger.First.One繼承了logger.First的屬性。位于命名空間最高層的Logger是默認Logger,也被稱為根Logger(Root Logger)。
3.1.2 實現自己的Logger
如果要實現自己的Logger,那么log4net提供了接口ILog用于實現自己的Logger。ILog的大致結構如下:
public interface Ilog
{
void Debug(object message);
void Info(object message);
void Warn(object message);
void Error(object message);
void Fatal(object message);
void Debug(object message, Exception ex);
bool isDebugEnabled;
bool isInfoEnabled;
}
在Logger中,log4net提供了一個名為LogManager的類給我們用于獲取或者創建一個Logger。LogManager提供了方法GetLogger(),該方法接收一個string類型的參數,用于指定Logger的名稱:
log4net.ILog log = log4net.LogManager.GetLogger(”Logger_Name”) ;
當指定名稱的Logger不存在時,LogManager將自動創建一個。通常情況下,都是使用Logger所在類的名稱來作為Logger的名稱,即GetLogger方法的參數可以是typeof(ClassName)。也可以使用如下的方法來傳遞該參數:
log4net.Ilog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
盡管上面的代碼比typeof(ClassName)要長的多,但是這樣做可以在任何一個類中使用相同的方法傳遞參數,從而減少出錯的機率。
3.2 Logger Level:log級別
從上面的ILog的接口可以看出,log4net有5種不同的記錄方式。為什么需要有這5種記錄方式呢?其實,這5種記錄方式存在不同的優先級別。這些級別定義在log4net.spi.level中。可以根據需要在應用中使用任意一個方法,但是,為了在使用了這些方法之后,在回收時不至于浪費太多的CPU周期。因此,log4net提供了7個等級以及它們各自的布爾屬性來節省CPU周期,如下:
Logger的不同等級:
Level
|
Allow Method
|
Boolean Property
|
Value
|
OFF
|
|
|
Highest
|
FATAL
|
void Fatal(...);
|
bool IsFatalEnabled;
|
|
ERROR
|
void Error(...);
|
bool IsErrorEnabled;
|
|
WARN
|
void Warn(...);
|
bool IsWarnEnabled;
|
|
INFO
|
void Info(...);
|
bool IsInfoEnabled;
|
|
DEBUG
|
void Debug(...);
|
bool IsDebugEnabled;
|
|
ALL
|
|
|
Lowest
|
在log4net中,每一個Logger會通過配置文件中的配置信息給予一個優先級別,如果沒有指定的優先級別,那么它將嘗試從它的父類中繼承一個優先級別。同樣,Logger的每一個方法都有一個預定義的級別,如上表中列出的,Info()方法有著INFO的級別。當運行時,log4net會檢查方法的級別以及配置文件賦予Logger的級別,然后執行不同的操作。例如,假設某個Logger具有INFO的級別,那么當執行如下操作時:
Logger.Info(“message”);
Logger.Debug(“message”);
Logger.Warn(“message”);
將會有如下的情況:
1、 方法Info的級別等于Logger的INFO級別,那么Info方法將執行;
2、 方法Debug的級別低于Logger的INFO級別,那么Debug方法將不執行或拋出異常;
3、方法Warn的級別高于Logger的INFO級別,那么Warn方法將被執行。
由此可以看出,當方法的級別大于或等于Logger的級別時,方法將得以執行。
在上表中還定義了兩個特殊的級別:ALL和OFF。ALL意味著任何方法都可以執行,OFF則相反。為了明確那些操作能夠執行,可以用上表中的屬性進行判斷:
if (logger.IsDebugEnabled){
Logger.Debug("message");
}
3.3 Appender:log目的地
每個Logger都可以擁有一個或者多個appender,每個appender表示一個log的輸出目的地,比如console、某個文件、數據庫甚至電子郵件。可以使用Logger.addAppender(Appender app)為logger增加一個appender;也可以使用Logger.removeAppender(Appender app)為logger移除一個appender。
默認情況下,Logger的additive標志被設置為true,表示子Logger將繼承父Logger的所有appenders。該選項可以被重置,表示子Logger將不再繼承父Logger的appenders。
Root Logger擁有目標為System.console的consoleAppender,故默認情況下,所有的Logger都將繼承該appender。
3.4 Layout:log格式化器
每個appender都和一個layout相聯系;layout的任務是格式化用戶的logging request。Layout使log的輸出樣式多樣,比如可以在輸出的log信息中包含log級別、log時間、線程、異常信息等。
appender的任務是把layout格式化好的輸出內容送往指定的目的地。
3.5 Configuration:配置信息
對log4net環境的配置就是對Root Logger的配置,包括把Root Logger設置為哪個級別(level);為它增加哪些appender,等等。這些可以通過設置系統屬性的方法來隱式地完成,也可以在程序里調用XXXConfigurator.configure()方法來顯式地完成。以上介紹的幾部分是log4net中最主要的幾部分,在使用log4net之前了解這幾部分的主要結構和作用非常有助于更好的使用log4net。下面介紹log4net在.net應用程序中的使用方法。
4 Log4net的使用方法
在.net應用程序中使用log4net非常簡單,完全不需要改變.net應用程序的結構,只需要為項目添加log4net引用,配置config文件,實例化一個Logger實例,在需要輸出log的地方調用Logger的方法即可。使用log4net最重要的地方是config文件的配置。
4.1 config文件配置
在Application項目中,log4net默認讀取配置信息的文件是App.config,在Web項目中默認讀取配置信息的文件是Web.config。但是config文件的配置方法在這兩種情況下都是相同的,所以可以很簡單的將一個config文件從Application項目移植到Web項目中。前面介紹過的將log輸出到文本文件、數據庫、XML文件等多種輸出形式,以及log輸出的多種樣式等,在應用程序中只需要配置config文件即可實現,完全不用改動程序。下面介紹將log輸出到文本文件和數據庫的config文件配置方法。
4.1.1 輸出log到文本文件的config文件配置
輸出log到文本文件,需要在config文件中指定log文件的存放路徑,文件名稱,log輸出格式,文本文件達到多大時重新創建文件等等,如下:
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"
/></configSections>
<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<param name="File" value="c:\LogData\log.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]\r\n" />
<param name="Footer" value="[Footer]\r\n" />
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x]
<%X{auth}> - %m%n" /></layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
</root>
<logger name="OpenDB">
<level value="INFO" />
</logger>
</log4net>
</configuration>
下面分析config文件配置信息中主要部分代表的意義:
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
這一部分定義了使用System.Configuration.IgnoreSectionHandler接口類讀取config文
件中的配置信息,一般來說,這一部分在所有的應用中是相同的。
<appender>和</appender>中間的部分分析:
這一部分首先定義了type="log4net.Appender.FileAppender"是指要輸出的log將寫入到文件(File)中,如果是寫入到數據庫中,這里將這樣配置:
<appender name="ADOAppender" type="log4net.Appender.ADONetAppender"
下面的部分指定了輸出文件的路徑及文件名:
<param name="File" value="c:\LogData\log.txt" />
<param name="AppendToFile" value="true" />
<layout>和 </layout>中間的部分指定log輸出的樣式:
<PRE style="BACKGROUND: #dddddd; MARGIN: 12pt 0cm; LAYOUT-GRID-M
posted on 2007-05-22 17:43 小辭猬 閱讀(1923) 評論(0) 編輯 收藏 所屬分類: DoNet