財務數(shù)據(jù)審計分析系統(tǒng)功能-窗口管理及整合auditsystem代碼log4net使用指南_第1頁
財務數(shù)據(jù)審計分析系統(tǒng)功能-窗口管理及整合auditsystem代碼log4net使用指南_第2頁
財務數(shù)據(jù)審計分析系統(tǒng)功能-窗口管理及整合auditsystem代碼log4net使用指南_第3頁
財務數(shù)據(jù)審計分析系統(tǒng)功能-窗口管理及整合auditsystem代碼log4net使用指南_第4頁
財務數(shù)據(jù)審計分析系統(tǒng)功能-窗口管理及整合auditsystem代碼log4net使用指南_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、Log4Net 使用指南:本文內(nèi)容主要譯自Nauman Leghari 的Using log4net,亦加入了個人的一點心得(節(jié) 3.1.4)。請在這里示例代碼1簡介1.1Log4net 的優(yōu)點:幾乎所有的大型應用都會有自己的用于調(diào)試的 API。因為一旦程序被部署以后,就不太可能再利用專門的調(diào)試工具了。然而一個管理員可能需要有一套強大的日志系統(tǒng)來和修復配置上。經(jīng)驗表明,日志往往是開發(fā)周期中的重要組成部分。它具有以下幾個優(yōu)點:它可以提供應用程序運行時的精確環(huán)境,可供開發(fā)盡快找到應用程序中的 Bug;一旦在程序中加入了 Log 輸出代碼,程序運行過程中就能生成并輸出日志信息而無需人工干預。另外,日

2、志信息可以輸出到不同的臺,文件等)以備以后研究之用。Log4net 就是為這樣一個目的設計的,用于.NET 開發(fā)環(huán)境的日志包。1.2Log4net 的安裝:用戶可以從log4net 的源代碼。解壓包后,在解壓的 src 目錄下將 log4net.sln 載入 Visual Studio .NET,編譯后可以得到 log4net.dll。用戶要在自己的程序里加入日志功能,只需將log4net.dll 引入工程即可。2Log4net 的結構log4net 有四種主要的組件,分別是 Logger(器), Reitory(庫),Appender(附著器)以及 Layout(布局).2.1Logger2

3、.1.1Logger 接口Logger 是應用程序需要交互的主要組件,它用來產(chǎn)生日志消息。產(chǎn)生的日志消息并不直接顯示,還要預先經(jīng)過 Layout 的格式化處理后才會輸出。Logger 提供了多種方式來一個日志消息,你可以在你的應用程序里創(chuàng)建多個 Logger,每個實例化的 Logger 對象都被 log4net 框架作為命名實體(named entity)來。這意味著為了重用 Logger 對象,你不必將它在不同的類或對象間傳遞,只需要用它的名字為參數(shù)調(diào)用就可以了。log4net 框架使用繼承體系,繼承體系類似于.NET 中的名字空間。也就是說,如果有兩個 logger,分別被定義為 a.b.

4、c 和 a.b,那么說 a.b是 a.b.c 的祖先。每一個 logger 都繼承了祖先的屬性Log4net 框架定義了一個 ILog 接口,所有的 logger 類都必須實現(xiàn)這個接口。如果你想實現(xiàn)一個自定義的 logger,你必須首先實現(xiàn)這個接口。你可以參考在/exten目錄下的幾個例子。ILog 接口的定義如下:publicerface ILogvoidDebug(object message);voidInfo(object message);voidWarn(object message);voidError(object message);voidFatal(object messa

5、ge);/以上的每一個方法都有一個重載的方法,用來支持異常處理。/每一個重載方法都如下所示,有一個異常類型的附加參數(shù)。void Debug(object message, Exception ex);正如你在 ILog 的接口中看到的一樣,有五種不同的方法可以一個應用程序。事實上,這五種方法是在 Logger 對象設置的不同日志優(yōu)先級別上。這幾種不同的級別是作為常量定義在 log4net.spi.Level 類中。你可以在程序中使用任何法。但是在最后的發(fā)布中你也許不想讓2.1.2日志的級別/ ./屬性用來檢查 Logger 的日志級別/(馬上會在后面看到日志級別)bool isDebugEna

6、bled; bool isInfoEnabled;/ 其他方法對應的屬性Log4net 框架定義了一個叫做 LogManager 的類,用來管理所有的 logger對象。它有一個 GetLogger()靜態(tài)方法,用 提供的名字參數(shù)來檢索已經(jīng)存在的 Logger 對象。如果框架里不存在該 Logger 對象,它也會為創(chuàng)建一個 Logger 對象。代碼如下所示:log4net.ILog log = log4net.LogManager.GetLogger(logger-name);通常來說, 會以類( class )的類型( type )為參數(shù)來調(diào)用 GetLogger(),以便 正在進行日志 的

7、類。傳遞的類(class)的類型(type)可以用 typeof(Cla ame)方法來獲得,或者可以用如下的反射方法來獲得:System.Reflection.MethodBase.GetCurrentMethod().DeclaringType盡管符號長了一些,但是后者可以用于一些場合,比如獲取調(diào)用方法的類(class)的類型(type)。表 1 Logger 的日志級別在 log4net 框架里,通過設置配置文件,每個日志對象都被分配了一個日志優(yōu)先級別。如果沒有給一個日志對象顯式地分配一個級別,那么該對象會試圖從他的祖先繼承一個級別值。級別允許的方法屬性優(yōu)先級別OFFHighestFAT

8、ALvoid Fatal(.);bool IsFatalEnabled;RRORvoid Error(.);bool IsErrorEnabled;WARNvoid Warn(.);bool IsWarnEnabled;INFOvoid Info(.);bool IsInfoEnabled;DEBUGvoid Debug(.);bool IsDebugEnabled;ALLLowestLevel 有以下幾種取值屬性來控制日志的類型。所有的代碼來浪費你的 CPU 周期,因此,框架提供了 7 種級別和相應的ILog 接口的每個方法都有一個預先定義好了的級別值。正如你在表 1 看到的,ILog 的

9、Inof()方法具有 INFO 級別。同樣的,以此類推,Error()方法具有 ERROR 級別。當使用以上的任何法時,log4net 框架會檢查日志對象 logger 的級別和方法的級別。只有當方法的級別高于日志級別時,日志請求才會被接受并執(zhí)行。舉例說明,當你創(chuàng)建了一個日志對象,并且把他的級別設置為 INFO。于是框架會設置日志的每個屬性。當你調(diào)用相應的日志方法時,框架會檢查相應的屬性,以決定該方法能不能執(zhí)行。如下的代碼:Logger.Info(message);Logger.Debug(message);Logger.Warn(message);對于第法,Info()的級別等與日志的級別(

10、INFO),因此日志請求會被傳遞,可以得到輸出結果”message”。對于第二種方法,Debug()的級別低于日志對象 logger 的日志級別(INFO),因此,日志請求被了,得不到任何輸出。同樣的,針對第三行語句,可以很容易得出結論。在表 1 中有兩個特殊的級別:ALL 和 OFF。ALL 表示允許所有的日志請求。OFF 是所有的請求。你也可以顯式地檢查 Logger 對象的屬性,如下所示:if (logger.IsDebugEnabled)Logger.Debug(message);2.2ReitoryReitory 主要用于負責日志對象組織結構的。在 log4net 的以前版本中,框架

11、僅支持分等級的組織結構(hierarchicalanization)。這種等級結構本質上是庫的一個實現(xiàn),并且定義在 log4net.Reitory.Hierarchy 名字空間中。要實現(xiàn)一個 Reitory,需要實現(xiàn) log4net.Reitory.ILoggerReitory接 口 。 但 是 通 常 并 不 是 直 接 實 現(xiàn) 該 接 口 , 而 是 以log4net.Reitory.LoggerReitorySkeleton 為基類繼承。體系庫 (hierarchical reitory )則由 log4net.Reitory.Hierarchy.Hierarchy類實現(xiàn)。如果你是個 l

12、og4net 框架的使用者,而非擴展者,那么你幾乎不會在你的代碼里用到 Reitory 的類。相反的,你需要用到 LogManager 類來自動管理庫和日志對象。2.3Appender一個好的日志框架應該能夠產(chǎn)生多目的地的輸出。比如說輸出到控制臺或保存到一個日志文件。log4net 能夠很好的滿足這些要求。它使用一個叫做 Appender的組件來定義輸出介質。正如名字所示,這些組件把它們附加到 Logger 日志組件上并將輸出傳遞到輸出流中。你可以把多個 Appender 組件附加到一個日志對象上。 Log4net 框架提供了幾個 Appender 組件。關于 log4net 提供的 Appe

13、nder組件的完整列表可以在 log4net 框架的幫助手冊中找到。有了這些現(xiàn)成的Appender 組件,一般來說你沒有必要再自己編寫了。但是如果你愿意,可以從log4net.Appender.AppenderSkeleton 類繼承。2.4Appender Filters一個 Appender 對象缺省地將所有的日志事件傳遞到輸出流。Appender 的過濾器(Appender Filters) 可以按照不同的標準過濾日志事件。在 log4net.Filter的名字空間下已經(jīng)有幾個預定義的過濾器。使用這些過濾器,你可以按照日志級別范圍過濾日志事件,或者按照某個特殊的字符串進行過濾。你可以在

14、API 的幫助文件中發(fā)現(xiàn)關于過濾器的信息。2.5LayoutLayout 組件用于向用戶顯示最后經(jīng)過格式化的輸出信息。輸出信息可以以多種格式顯示,主要依賴于采用的 Layout 組件類型。可以是線性的或一個 XML文件。Layout 組件和一個 Appender 組件一起工作。API 幫助手冊中有關于不同Layout 組件的列表。一個 Appender 對象,只能對應一個 Layout 對象。要實現(xiàn)你自己的 Layout 類,你需要從 log4net.Layout.LayoutSkeleton 類繼承,它實現(xiàn)了 ILayout 接口。3在程序中使用 log4net在開始對你的程序進行日志前,需

15、要先啟動 log4net 引擎。這意味著你需要先配置前面提到的三種組件。你可以用兩種方法來設定配置:在單獨的文件中設定配置或在代碼中定義配置。因為下面幾種原因,在一個單獨的文件中定義配置:你不需要重新編譯源代碼就能改變配置;你可以在程序正運行的時候就改變配置。這一點在一些 WEB 程序和過程調(diào)用的程序中有時很重要;考慮到第法的重要性,先看看怎樣在文件中設定配置信息。3.1定義配置文件配置信息可以放在如下幾種形式文件的一種中。在程序的配置文件里,如 AssemblyName.config 或 web.config.在你自己的文件里。文件名可以是任何你想要的名字,如 AppName.exe.xyz

16、 等.log4net 框架會在相對于 App.Current.BaseDirectory 屬性定義的目錄路徑下查找配置文件??蚣茉谂渲梦募镆檎业奈ㄒ粯俗R是。一個完整的配置文件的例子如下:appender name=ConsoleAppender在框架的體系里,所有的日志對象都是根日志(root logger)的后代。 因此如果一個日志對象沒有在配置文件里顯式定義,則框架使用根日志中type=log4net.Appender.ConsoleAppender 你可以直接將上面的文本拷貝到任何程序中使用,但是最好還是能夠理解配置文件是怎樣的。 只有當你需要在應用程序配置文件中使用 log4net

17、 配置時,才需要在中加入配置節(jié)點。對于其他的單獨文件,只有內(nèi)的文本才是必需的,這些的順序并不是固定的。下面依次講解各個內(nèi)文本的含義:.3 元素預定義了一個具體日志對象的設置。然后通過調(diào)用 LogManager.GetLogger(“testAPP.Logging”)函數(shù),你可以檢索具有該名字的日志。如果 LogManager.GetLogger()打開的不是預定義的日志對象,則該日志對象會繼承根日志對象的屬性。知道了這一點, 可以說,其實 并不是必須的。3.1.2定義的屬性。在里,可以定義 level 級別值和 Appender 的列表。如果沒有定義 LEVEL 的值,則缺省為

18、 DEBUG。可以通過定義日志對象使用的 Appender 對象。了在其他地方定義的 Appender 對象的一個 。在一個 logger 對象中的設置會覆蓋根日志的設置。而對 Appender 屬性來說,子日志對象則會繼承父日志對象的 Appender 列表。這種缺省的行為方式也可以通過顯式地設定 的 additivity 屬性為 false 而改變。Additivity 的值缺省是 true.在 或單個的 里的 Appender對象可以用 定義。的基本形式如上面所示。它定義了 appender 的名字和類型。 另外比較重要的是的其他。不同的 appender 有不同的。在這里,為了使用Fi

19、leAppender, 你需要一個文件名作為參數(shù)。另外還需要一個在 定義一個 Layout 對象。Layout 對象定義在它自己%L:輸出語句所在的行號%F:輸出語句所在的文件名%-數(shù)字:表示該項的最小長度,如果不夠,則用空格填充ILog log=LogManager.GetLogger(“Exam.Log”); log.Debug(“o”);則輸出為下面的形式:Exam.Log-o%m(message):輸出的日志消息,如 ILog.Debug()輸出的一條消息%n(new line):換行%d(datetime):輸出當前語句運行的時刻%r(run time):輸出程序從運行到執(zhí)行到當前語

20、句時消耗的毫秒數(shù)%t(thread id):當前語句所在的線程 ID%p(priority): 日志的當前優(yōu)先級別,即 DEBUG、INFO、WARN等%c(class):當前日志對象的名稱,例如:模式字符串為:%-10c -%m%n代碼為:3.1.4log4net.Layout.PatternLayout 中的轉換模式(ConverPattern)的 內(nèi)。 的 type 屬性定義了 Layout 的類型(在本例里是 PatternLayout),同時也確定了需要提供的參數(shù)值。Header和 Footer 提供了一個日志會話(logging ses )開始和結束時輸出的文字。有關每種 appe

21、nder 的具體 配置的例子,可以在 log4netdocmanualex le-config-appender.html 中得到。ConfigFile:了的配置文件的路徑及文件名,包括擴展名。當創(chuàng)建了上面的配置文件后,接下來需要把它和的應用聯(lián)系起來。缺省的,每個獨立的可執(zhí)行程序集都會定義它自己的配置。log4net 框架使用 log4net.Config.DOMConfiguratorAttribute 在程序集的級別上定義配置文件。例如:可以在項目的 AssemblyInfo.cs 文件里添加以下的語句assembly:log4net.Config.DOMConfigurator(Conf

22、igFile=filename,ConfigFileExten=ext,Watch=true/false)使用配置文件關聯(lián)配置文件最后,讓看看在 Appender 元素里的。它定義了應用到Appender 對象的過濾器。本例中,使用了 LevelRangeFilter 過濾器,它可以只LevelMin 和LevelMax 參數(shù)指定的日志級別之間的日志事件??梢栽谝粋€ Appender 上定義多個過濾器(Filter),這些過濾器將會按照它們定義的順序對日志事件進行過濾。其他過濾器的有關信息可以在 log4net 的 SDK 文檔中找到。3.1.5例如,轉換模式為%r %t%-5p %c - %

23、m%n 的 PatternLayout 將生成類似于以下內(nèi)容的輸出:176 main INFO.foo.Bar - Located nearest gas sion.3.2.2創(chuàng)建或獲取日志對象ConfigFile 了配置文件的名字,例如,ConfigFile=”Config.txt”ConfigFileExten 則是指明了和可執(zhí)行程序集同名的配置文件的擴展 名 , 例 如 , 應 用 程 序 的 名 稱是”test.exe”,ConfigFileExten =”txt”, 則配置文件就應該 是”test.exe.txt” ;也可以不帶參數(shù)應用 DOMConfiguratio():assem

24、bly: log4net.Config.DOMConfigurator()也可以在程序代碼中用 DOMConfigurator 類打開配置文件。類的構造函數(shù)需要一個 FileInfo 對象作參數(shù),以 要打開的配置文件名。 這個方法和前面在程序集里設置屬性打開一個配置文件的效果是一樣的。log4net.Config.DOMConfigurator.Configure( new FileInfo(TestLogger.Exe.Config);DOMConfigurator 類還有一個方法 ConfigureAndWatch(.), 用來配置框架并檢測文件的變化。以上的步驟總結了和配置相關的各個方面

25、,下面分兩步來使用logger 對象。其中: ConfigFile 和 ConfigFileExten屬性不能同時使用, ConfigFileExten :如果 對被編譯程序的程序集使用了不同的文件擴展名,那么 需要定義這個屬性,缺省的,程序集的配置文件擴展名為”config”。Watch ( 屬性): log4net 框架用這個屬性來確定是否需要在運行時監(jiān)視文件的改變。如果這個屬性為 true,那么 FileSystemWatcher 將會被用來監(jiān)視文件的改變,重命名,刪除等事件。3.3在程序中配置 log4net除了前面講的用一個配置文件來配置 log4net 以外,還可以在程序中用代碼來

26、配置 log4net 框架。如下面的例子:/ 和 PatternLayout 一起使用 FileAppender log4net.Config.BasicConfigurator.Configure( new log4net.Appender.FileAppender(new log4net.Layout.PatternLayout(%d%t%-5p %c %x - %m%n),testfile.log);/ using a FileAppender win XMLLayout log4net.Config.BasicConfigurator.Configure(可以使用 ILog 的幾種方法

27、輸出日志信息。你也可以在調(diào)用某方法前先檢查 IsEnabled 布爾變量,再決定是否調(diào)用輸出日志信息的函數(shù),這樣可以提高程序的性能。因為框架在調(diào)用如 ILog.Debug()這樣的函數(shù)時,也會先判斷是否滿足 Level 日志級別條件。 if (log.IsDebugEnabled) log.Debug(message); if (log.IsInfoEnabled) log.Info(message);3.2.3輸出日志信息日志對象會使用在配置文件里定義的屬性。如果某個日志對象沒有事先在配置文件里定義,那么框架會根據(jù)繼承結構獲取祖先節(jié)點的屬性,最終的,會從根日志獲取屬性。如下所示:Log4net.ILog log = Log4net.LogManager.GetLogger(MyLogger);new log4net.Appender.FileAppender(new log4n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論