精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ASP.NET調(diào)試API之Log4net使用指南

開發(fā) 后端
幾乎所有的大型應(yīng)用都會(huì)有自己的用于跟蹤調(diào)試的API。Log4net是用于.NET開發(fā)環(huán)境的日志記錄包。本文介紹這個(gè)ASP.NET調(diào)試API的優(yōu)點(diǎn)和使用。

以下為ASP.NET調(diào)試API:Log4net使用指南。

1 簡(jiǎn)介

1.1 Log4net的優(yōu)點(diǎn):

幾乎所有的大型應(yīng)用都會(huì)有自己的用于跟蹤調(diào)試的API。因?yàn)橐坏┏绦虮徊渴鹨院螅筒惶赡茉倮脤iT的調(diào)試工具了。然而一個(gè)管理員可能需要有一套強(qiáng)大的日志系統(tǒng)來(lái)診斷和修復(fù)配置上的問(wèn)題。

經(jīng)驗(yàn)表明,日志記錄往往是軟件開發(fā)周期中的重要組成部分。它具有以下幾個(gè)優(yōu)點(diǎn):它可以提供應(yīng)用程序運(yùn)行時(shí)的精確環(huán)境,可供開發(fā)人員盡快找到應(yīng)用程序中的 Bug;一旦在程序中加入了Log 輸出代碼,程序運(yùn)行過(guò)程中就能生成并輸出日志信息而無(wú)需人工干預(yù)。另外,日志信息可以輸出到不同的地方(控制臺(tái),文件等)以備以后研究之用。

Log4net就是為這樣一個(gè)目的設(shè)計(jì)的,用于.NET開發(fā)環(huán)境的日志記錄包。

1.2 ASP.NET調(diào)試工具之Log4net的安裝:

用戶可以從http://logging.apache.org/log4net/下載log4net的源代碼。解壓軟件包后,在解壓的src目錄下將 log4net.sln載入Visual Studio .NET,編譯后可以得到log4net.dll。用戶要在自己的程序里加入日志功能,只需將log4net.dll引入工程即可。

2 Log4net的結(jié)構(gòu)

log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫(kù)), Appender(附著器)以及 Layout(布局).

2.1 Logger

2.1.1 Logger接口

Logger是應(yīng)用程序需要交互的主要組件,它用來(lái)產(chǎn)生日志消息。產(chǎn)生的日志消息并不直接顯示,還要預(yù)先經(jīng)過(guò)Layout的格式化處理后才會(huì)輸出。

Logger 提供了多種方式來(lái)記錄一個(gè)日志消息,你可以在你的應(yīng)用程序里創(chuàng)建多個(gè)Logger,每個(gè)實(shí)例化的Logger對(duì)象都被log4net框架作為命名實(shí)體 (named entity)來(lái)維護(hù)。這意味著為了重用Logger對(duì)象,你不必將它在不同的類或?qū)ο箝g傳遞,只需要用它的名字為參數(shù)調(diào)用就可以了。log4net框架使用繼承體系,繼承體系類似于.NET中的名字空間。也就是說(shuō),如果有兩個(gè)logger,分別被定義為a.b.c和a.b,那么我們說(shuō)a.b是a.b.c 的祖先。每一個(gè)logger都繼承了祖先的屬性

Log4net框架定義了一個(gè)ILog接口,所有的logger類都必須實(shí)現(xiàn)這個(gè)接口。如果你想實(shí)現(xiàn)一個(gè)自定義的logger,你必須首先實(shí)現(xiàn)這個(gè)接口。你可以參考在/extension目錄下的幾個(gè)例子。

ILog接口的定義如下:

  1. public interface ILog   
  2. {   
  3.   void Debug(object message);   
  4.   void Info(object message);   
  5.   void Warn(object message);   
  6.   void Error(object message);   
  7.   void Fatal(object message);   
  8.     
  9. //以上的每一個(gè)方法都有一個(gè)重載的方法,用來(lái)支持異常處理。   
  10. //每一個(gè)重載方法都如下所示,有一個(gè)異常類型的附加參數(shù)。   
  11.   void Debug(object message, Exception ex);   
  12.   // ...   
  13.     
  14. //Boolean 屬性用來(lái)檢查L(zhǎng)ogger的日志級(jí)別   
  15. //(我們馬上會(huì)在后面看到日志級(jí)別)   
  16.   bool isDebugEnabled;   
  17.   bool isInfoEnabled;   
  18.   //… 其他方法對(duì)應(yīng)的Boolean屬性   
  19. }  

Log4net框架定義了一個(gè)叫做LogManager的類,用來(lái)管理所有的logger對(duì)象。它有一個(gè) GetLogger()靜態(tài)方法,用我們提供的名字參數(shù)來(lái)檢索已經(jīng)存在的Logger對(duì)象。如果框架里不存在該Logger對(duì)象,它也會(huì)為我們創(chuàng)建一個(gè) Logger對(duì)象。代碼如下所示:

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

通常來(lái)說(shuō),我們會(huì)以類(class)的類型(type)為參數(shù)來(lái)調(diào)用GetLogger(),以便跟蹤我們正在進(jìn)行日志記錄的類。傳遞的類(class)的類型(type)可以用typeof(Classname)方法來(lái)獲得,或者可以用如下的反射方法來(lái)獲得:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

盡管符號(hào)長(zhǎng)了一些,但是后者可以用于一些場(chǎng)合,比如獲取調(diào)用方法的類(class)的類型(type)。

2.1.2 日志的級(jí)別

正如你在ILog的接口中看到的一樣,有五種不同的方法可以跟蹤一個(gè)應(yīng)用程序。事實(shí)上,這五種方法是運(yùn)作在Logger對(duì)象設(shè)置的不同日志優(yōu)先級(jí)別上。這幾種不同的級(jí)別是作為常量定義在log4net.spi.Level類中。你可以在程序中使用任何一種方法。但是在***的發(fā)布中你也許不想讓所有的代碼來(lái)浪費(fèi)你的CPU周期,因此,框架提供了7種級(jí)別和相應(yīng)的Boolean屬性來(lái)控制日志記錄的類型。

Level有以下幾種取值

Logger的日志級(jí)別 

表1 Logger的日志級(jí)別

在log4net框架里,通過(guò)設(shè)置配置文件,每個(gè)日志對(duì)象都被分配了一個(gè)日志優(yōu)先級(jí)別。如果沒有給一個(gè)日志對(duì)象顯式地分配一個(gè)級(jí)別,那么該對(duì)象會(huì)試圖從他的祖先繼承一個(gè)級(jí)別值。

ILog 接口的每個(gè)方法都有一個(gè)預(yù)先定義好了的級(jí)別值。正如你在表1看到的,ILog的Inof()方法具有INFO級(jí)別。同樣的,以此類推,Error()方法具有ERROR級(jí)別。當(dāng)我們使用以上的任何一種方法時(shí),log4net框架會(huì)檢查日志對(duì)象logger的級(jí)別和方法的級(jí)別。只有當(dāng)方法的級(jí)別高于日志級(jí)別時(shí),日志請(qǐng)求才會(huì)被接受并執(zhí)行。

舉例說(shuō)明,當(dāng)你創(chuàng)建了一個(gè)日志對(duì)象,并且把他的級(jí)別設(shè)置為INFO。于是框架會(huì)設(shè)置日志的每個(gè)Boolean屬性。當(dāng)你調(diào)用相應(yīng)的日志方法時(shí),框架會(huì)檢查相應(yīng)的Boolean屬性,以決定該方法能不能執(zhí)行。如下的代碼: 

  1. Logger.Info("message");   
  2. Logger.Debug("message");   
  3. Logger.Warn("message");  

對(duì)于***種方法,Info()的級(jí)別等與日志的級(jí)別(INFO),因此日志請(qǐng)求會(huì)被傳遞,我們可以得到輸出結(jié)果”message”。

對(duì)于第二種方法,Debug()的級(jí)別低于日志對(duì)象logger的日志級(jí)別(INFO),因此,日志請(qǐng)求被拒絕了,我們得不到任何輸出。同樣的,針對(duì)第三行語(yǔ)句,我們可以很容易得出結(jié)論。

在表1中有兩個(gè)特殊的級(jí)別:ALL和OFF。ALL表示允許所有的日志請(qǐng)求。OFF是拒絕所有的請(qǐng)求。

你也可以顯式地檢查L(zhǎng)ogger對(duì)象的Boolean屬性,如下所示: 

  1. if (logger.IsDebugEnabled)   
  2. {   
  3. Logger.Debug("message");   
  4. }  

2.2 Repository

Repository 主要用于負(fù)責(zé)日志對(duì)象組織結(jié)構(gòu)的維護(hù)。在log4net的以前版本中,框架僅支持分等級(jí)的組織結(jié)構(gòu)(hierarchical organization)。這種等級(jí)結(jié)構(gòu)本質(zhì)上是庫(kù)的一個(gè)實(shí)現(xiàn),并且定義在log4net.Repository.Hierarchy 名字空間中。要實(shí)現(xiàn)一個(gè)Repository,需要實(shí)現(xiàn)log4net.Repository.ILoggerRepository 接口。但是通常并不是直接實(shí)現(xiàn)該接口,而是以log4net.Repository.LoggerRepositorySkeleton為基類繼承。體系庫(kù) (hierarchical repository )則由log4net.Repository.Hierarchy.Hierarchy類實(shí)現(xiàn)。

如果你是個(gè)log4net框架的使用者,而非擴(kuò)展者,那么你幾乎不會(huì)在你的代碼里用到Repository的類。相反的,你需要用到LogManager類來(lái)自動(dòng)管理庫(kù)和日志對(duì)象。

2.3 Appender

一個(gè)好的日志框架應(yīng)該能夠產(chǎn)生多目的地的輸出。比如說(shuō)輸出到控制臺(tái)或保存到一個(gè)日志文件。log4net 能夠很好的滿足這些要求。它使用一個(gè)叫做Appender的組件來(lái)定義輸出介質(zhì)。正如名字所示,這些組件把它們附加到Logger日志組件上并將輸出傳遞到輸出流中。你可以把多個(gè)Appender組件附加到一個(gè)日志對(duì)象上。 Log4net框架提供了幾個(gè)Appender組件。關(guān)于log4net提供的Appender組件的完整列表可以在log4net框架的幫助手冊(cè)中找到。有了這些現(xiàn)成的Appender組件,一般來(lái)說(shuō)你沒有必要再自己編寫了。但是如果你愿意,可以從 log4net.Appender.AppenderSkeleton類繼承。

2.4 Appender Filters

一個(gè)Appender 對(duì)象缺省地將所有的日志事件傳遞到輸出流。Appender的過(guò)濾器(Appender Filters) 可以按照不同的標(biāo)準(zhǔn)過(guò)濾日志事件。在log4net.Filter的名字空間下已經(jīng)有幾個(gè)預(yù)定義的過(guò)濾器。使用這些過(guò)濾器,你可以按照日志級(jí)別范圍過(guò)濾日志事件,或者按照某個(gè)特殊的字符串進(jìn)行過(guò)濾。你可以在API的幫助文件中發(fā)現(xiàn)更多關(guān)于過(guò)濾器的信息。

2.5 Layout

Layout 組件用于向用戶顯示***經(jīng)過(guò)格式化的輸出信息。輸出信息可以以多種格式顯示,主要依賴于我們采用的Layout組件類型。可以是線性的或一個(gè)XML文件。 Layout組件和一個(gè)Appender組件一起工作。API幫助手冊(cè)中有關(guān)于不同Layout組件的列表。一個(gè)Appender對(duì)象,只能對(duì)應(yīng)一個(gè) Layout對(duì)象。要實(shí)現(xiàn)你自己的Layout類,你需要從log4net.Layout.LayoutSkeleton類繼承,它實(shí)現(xiàn)了ILayout 接口。

3 在程序中使用log4net

在開始對(duì)你的程序進(jìn)行日志記錄前,需要先啟動(dòng)log4net引擎。這意味著你需要先配置前面提到的三種組件。你可以用兩種方法來(lái)設(shè)定配置:在單獨(dú)的文件中設(shè)定配置或在代碼中定義配置。

因?yàn)橄旅鎺追N原因,推薦在一個(gè)單獨(dú)的文件中定義配置:

l 你不需要重新編譯源代碼就能改變配置;

l 你可以在程序正運(yùn)行的時(shí)候就改變配置。這一點(diǎn)在一些WEB程序和遠(yuǎn)程過(guò)程調(diào)用的程序中有時(shí)很重要;

考慮到***種方法的重要性,我們先看看怎樣在文件中設(shè)定配置信息。

3.1 定義配置文件

配置信息可以放在如下幾種形式文件的一種中。

在程序的配置文件里,如AssemblyName.config 或web.config.

在你自己的文件里。文件名可以是任何你想要的名字,如AppName.exe.xyz等.

log4net框架會(huì)在相對(duì)于AppDomain.CurrentDomain.BaseDirectory 屬性定義的目錄路徑下查找配置文件。框架在配置文件里要查找的唯一標(biāo)識(shí)是<log4net>標(biāo)簽。一個(gè)完整的配置文件的例子如下: 

 

  1. < ?xml version="1.0" encoding="utf-8" ?>   
  2. < configuration>   
  3.   < configSections>   
  4.     < section name="log4net"   
  5.       type="log4net.Config.Log4NetConfigurationSectionHandler,   
  6.             log4net-net-1.0"   
  7.     />   
  8.   < /configSections>   
  9.     
  10.   < log4net>   
  11.     
  12.     < root>   
  13.       < level value="WARN" />   
  14.       < appender-ref ref="LogFileAppender" />   
  15.       < appender-ref ref="ConsoleAppender" />   
  16.     < /root>   
  17.     
  18.     < logger name="testApp.Logging">   
  19.       < level value="DEBUG"/>   
  20.     < /logger>   
  21.       
  22.     < appender name="LogFileAppender"   
  23.              type="log4net.Appender.FileAppender" >   
  24.       < param name="File" value="log-file.txt" />   
  25.       < param name="AppendToFile" value="true" />   
  26.     
  27.       < layout type="log4net.Layout.PatternLayout">   
  28.         < param name="Header" value="[Header]\r\n"/>   
  29.         < param name="Footer" value="[Footer]\r\n"/>   
  30.         < param name="ConversionPattern"   
  31.            value="%d [%t] %-5p %c [%x]  - %m%n"   
  32.          />   
  33.       < /layout>   
  34.     
  35.       < filter type="log4net.Filter.LevelRangeFilter">   
  36.         < param name="LevelMin" value="DEBUG" />   
  37.         < param name="LevelMax" value="WARN" />   
  38.       < /filter>   
  39.     < /appender>   
  40.       
  41.     < appender name="ConsoleAppender"   
  42.               type="log4net.Appender.ConsoleAppender" >   
  43.       < layout type="log4net.Layout.PatternLayout">   
  44.         < param name="ConversionPattern"   
  45.            value="%d [%t] %-5p %c [%x] - %m%n"   
  46.         />   
  47.       < /layout>   
  48.     < /appender>   
  49.       
  50.   < /log4net>   
  51. < /configuration>   

你可以直接將上面的文本拷貝到任何程序中使用,但是***還是能夠理解配置文件是怎樣構(gòu)成的。只有當(dāng)你需要在應(yīng)用程序配置文件中使用log4net配置時(shí),才需要在< configSection>標(biāo)簽中加入< section>配置節(jié)點(diǎn)入口。對(duì)于其他的單獨(dú)文件,只有< log4net>標(biāo)簽內(nèi)的文本才是必需的,這些標(biāo)簽的順序并不是固定的。下面我們依次講解各個(gè)標(biāo)簽內(nèi)文本的含義:

3.1.1 < root>

  1. < root>   
  2.   < level value="WARN" />   
  3.   < appender-ref ref="LogFileAppender" />   
  4.   < appender-ref ref="ConsoleAppender" />   
  5. < /root>  

 

在框架的體系里,所有的日志對(duì)象都是根日志(root logger)的后代。因此如果一個(gè)日志對(duì)象沒有在配置文件里顯式定義,則框架使用根日志中定義的屬性。在< root>標(biāo)簽里,可以定義level級(jí)別值和 Appender的列表。如果沒有定義LEVEL的值,則缺省為DEBUG。可以通過(guò)< appender-ref>標(biāo)簽定義日志對(duì)象使用的 Appender對(duì)象。< appender-ref>聲明了在其他地方定義的Appender對(duì)象的一個(gè)引用。在一個(gè)logger對(duì)象中的設(shè)置會(huì)覆蓋根日志的設(shè)置。而對(duì)Appender屬性來(lái)說(shuō),子日志對(duì)象則會(huì)繼承父日志對(duì)象的Appender列表。這種缺省的行為方式也可以通過(guò)顯式地設(shè)定< logger>標(biāo)簽的additivity屬性為false而改變。

  1. < logger name="testApp.Logging" additivity="false">   
  2. < /logger>  

Additivity的值缺省是true.

 

 

3.1.2 < Logger> 

  1. < logger name="testApp.Logging">   
  2. < level value="DEBUG"/>   
  3. < /logger>  

 

< logger> 元素預(yù)定義了一個(gè)具體日志對(duì)象的設(shè)置。然后通過(guò)調(diào)用LogManager.GetLogger(“testAPP.Logging”)函數(shù),你可以檢索具有該名字的日志。如果LogManager.GetLogger(…)打開的不是預(yù)定義的日志對(duì)象,則該日志對(duì)象會(huì)繼承根日志對(duì)象的屬性。知道了這一點(diǎn),我們可以說(shuō),其實(shí)< logger>標(biāo)簽并不是必須的。

3.1.3 < appender> 

  1. < appender name="LogFileAppender"   
  2.           type="log4net.Appender.FileAppender" >   
  3.   < param name="File" value="log-file.txt" />   
  4.   < param name="AppendToFile" value="true" />   
  5.   < layout type="log4net.Layout.PatternLayout">   
  6.     < param name="Header" value="[Header]\r\n" />   
  7.     < param name="Footer" value="[Footer]\r\n"/>   
  8.     < param name="ConversionPattern"   
  9.       value="%d [%t] %-5p %c - %m%n"   
  10.     />   
  11.   < /layout>   
  12.   < filter type="log4net.Filter.LevelRangeFilter">   
  13.     < param name="LevelMin" value="DEBUG" />   
  14.     < param name="LevelMax" value="WARN" />   
  15.   < /filter>   
  16. < /appender>  

在< root>標(biāo)簽或單個(gè)的< logger>標(biāo)簽里的Appender對(duì)象可以用< appender>標(biāo)簽定義。< appender>標(biāo)簽的基本形式如上面所示。它定義了appender的名字和類型。另外比較重要的是< appender>標(biāo)簽內(nèi)部的其他標(biāo)簽。不同的appender有不同的< param>標(biāo)簽。在這里,為了使用FileAppender,你需要一個(gè)文件名作為參數(shù)。另外還需要一個(gè)在< appender>標(biāo)簽內(nèi)部定義一個(gè)Layout對(duì)象。 Layout對(duì)象定義在它自己的< layout>標(biāo)簽內(nèi)。< layout>標(biāo)簽的type屬性定義了Layout的類型(在本例里是PatternLayout),同時(shí)也確定了需要提供的參數(shù)值。Header和Footer標(biāo)簽提供了一個(gè)日志會(huì)話(logging session)開始和結(jié)束時(shí)輸出的文字。有關(guān)每種appender的具體配置的例子,可以在log4net\doc\manual\example- config-appender.html中得到。

3.1.4 log4net.Layout.PatternLayout中的轉(zhuǎn)換模式(ConversionPattern)

%m(message):輸出的日志消息,如ILog.Debug(…)輸出的一條消息

%n(new line):換行

%d(datetime):輸出當(dāng)前語(yǔ)句運(yùn)行的時(shí)刻

%r(run time):輸出程序從運(yùn)行到執(zhí)行到當(dāng)前語(yǔ)句時(shí)消耗的毫秒數(shù)

%t(thread id):當(dāng)前語(yǔ)句所在的線程ID

%p(priority): 日志的當(dāng)前優(yōu)先級(jí)別,即DEBUG、INFO、WARN…等

%c(class):當(dāng)前日志對(duì)象的名稱,例如:

模式字符串為:%-10c -%m%n

代碼為:

  1. ILog log=LogManager.GetLogger(“Exam.Log”);   
  2. log.Debug(“Hello”);   

則輸出為下面的形式:

Exam.Log - Hello

%L:輸出語(yǔ)句所在的行號(hào)

%F:輸出語(yǔ)句所在的文件名

%-數(shù)字:表示該項(xiàng)的最小長(zhǎng)度,如果不夠,則用空格填充

例如,轉(zhuǎn)換模式為%r [%t]%-5p %c - %m%n 的 PatternLayout 將生成類似于以下內(nèi)容的輸出:

176 [main] INFO org.foo.Bar - Located nearest gas station.

 

3.1.5 < filter>

***,讓我們看看在Appender元素里的< filter>標(biāo)簽。它定義了應(yīng)用到Appender對(duì)象的過(guò)濾器。本例中,我們使用了 LevelRangeFilter過(guò)濾器,它可以只記錄LevelMin和LevelMax參數(shù)指定的日志級(jí)別之間的日志事件。可以在一個(gè) Appender上定義多個(gè)過(guò)濾器(Filter),這些過(guò)濾器將會(huì)按照它們定義的順序?qū)θ罩臼录M(jìn)行過(guò)濾。其他過(guò)濾器的有關(guān)信息可以在log4net的 SDK文檔中找到。

3.2 使用配置文件

3.2.1 關(guān)聯(lián)配置文件

當(dāng)我們創(chuàng)建了上面的配置文件后,我們接下來(lái)需要把它和我們的應(yīng)用聯(lián)系起來(lái)。缺省的,每個(gè)獨(dú)立的可執(zhí)行程序集都會(huì)定義它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的級(jí)別上定義配置文件。

例如:可以在項(xiàng)目的AssemblyInfo.cs文件里添加以下的語(yǔ)句

[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",

ConfigFileExtension="ext",Watch=true/false)]

l Configfile:指出了我們的配置文件的路徑及文件名,包括擴(kuò)展名。

l ConfigFileExtension:如果我們對(duì)被編譯程序的程序集使用了不同的文件擴(kuò)展名,那么我們需要定義這個(gè)屬性,缺省的,程序集的配置文件擴(kuò)展名為”config”。

l Watch (Boolean屬性): log4net框架用這個(gè)屬性來(lái)確定是否需要在運(yùn)行時(shí)監(jiān)視文件的改變。如果這個(gè)屬性為true,那么FileSystemWatcher將會(huì)被用來(lái)監(jiān)視文件的改變,重命名,刪除等事件。

其中:ConfigFile和ConfigFileExtension屬性不能同時(shí)使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”

ConfigFileExtension則是指明了和可執(zhí)行程序集同名的配置文件的擴(kuò)展名,例如,應(yīng)用程序的名稱是”test.exe”,ConfigFileExtension=”txt”,則配置文件就應(yīng)該是”test.exe.txt” ;

也可以不帶參數(shù)應(yīng)用DOMConfiguratio():

[assembly: log4net.Config.DOMConfigurator()]

也可以在程序代碼中用DOMConfigurator類打開配置文件。類的構(gòu)造函數(shù)需要一個(gè)FileInfo對(duì)象作參數(shù),以指出要打開的配置文件名。 這個(gè)方法和前面在程序集里設(shè)置屬性打開一個(gè)配置文件的效果是一樣的。

log4net.Config.DOMConfigurator.Configure(

new FileInfo("TestLogger.Exe.Config"));

DOMConfigurator 類還有一個(gè)方法ConfigureAndWatch(..), 用來(lái)配置框架并檢測(cè)文件的變化。

以上的步驟總結(jié)了和配置相關(guān)的各個(gè)方面,下面我們將分兩步來(lái)使用logger對(duì)象。

3.2.2 創(chuàng)建或獲取日志對(duì)象

日志對(duì)象會(huì)使用在配置文件里定義的屬性。如果某個(gè)日志對(duì)象沒有事先在配置文件里定義,那么框架會(huì)根據(jù)繼承結(jié)構(gòu)獲取祖先節(jié)點(diǎn)的屬性,最終的,會(huì)從根日志獲取屬性。如下所示:

Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");

3.2.3 輸出日志信息

可以使用ILog的幾種方法輸出日志信息。你也可以在調(diào)用某方法前先檢查IsXXXEnabled布爾變量,再?zèng)Q定是否調(diào)用輸出日志信息的函數(shù),這樣可以提高程序的性能。因?yàn)榭蚣茉谡{(diào)用如ILog.Debug(…)這樣的函數(shù)時(shí),也會(huì)先判斷是否滿足Level日志級(jí)別條件。

if (log.IsDebugEnabled) log.Debug("message");

if (log.IsInfoEnabled) log.Info("message);

3.3 在程序中配置log4net

除了前面講的用一個(gè)配置文件來(lái)配置log4net以外,還可以在程序中用代碼來(lái)配置log4net框架。如下面的例子: 

  1. // 和PatternLayout一起使用FileAppender   
  2. log4net.Config.BasicConfigurator.Configure(   
  3.   new log4net.Appender.FileAppender(   
  4.      new log4net.Layout.PatternLayout("%d   
  5.        [%t]%-5p %c [%x] - %m%n"),"testfile.log"));   
  6.     
  7. // using a FileAppender with an XMLLayout   
  8. log4net.Config.BasicConfigurator.Configure(   
  9.   new log4net.Appender.FileAppender(   
  10.     new log4net.Layout.XMLLayout(),"testfile.xml"));   
  11.     
  12. // using a ConsoleAppender with a PatternLayout   
  13. log4net.Config.BasicConfigurator.Configure(   
  14.   new log4net.Appender.ConsoleAppender(   
  15.     new log4net.Layout.PatternLayout("%d   
  16.       [%t] %-5p %c - %m%n")));   
  17.     
  18. // using a ConsoleAppender with a SimpleLayout   
  19. log4net.Config.BasicConfigurator.Configure(   
  20.   new log4net.Appender.ConsoleAppender(new   
  21.     log4net.Layout.SimpleLayout()));   

盡管這里用代碼配置log4net也很方便,但是你卻不能分別配置每個(gè)日志對(duì)象。所有的這些配置都是被應(yīng)用到根日志上的。

log4net.Config.BasicConfigurator 類使用靜態(tài)方法Configure 設(shè)置一個(gè)Appender 對(duì)象。而Appender的構(gòu)造函數(shù)又會(huì)相應(yīng)的要求Layout對(duì)象。你也可以不帶參數(shù)直接調(diào)用 BasicConfigurator.Configure(),它會(huì)使用一個(gè)缺省的PatternLayout對(duì)象,在一個(gè) ConsoleAppender中輸出信息。如下所示:

log4net.Config.BasicConfigurator.Configure();

在輸出時(shí)會(huì)顯示如下格式的信息:

0 [1688] DEBUG log1 A B C - Test

20 [1688] INFO log1 A B C - Test

當(dāng)log4net框架被配置好以后,就可以如前所述使用日志功能了。

4 總結(jié)

使用log4net可以很方便地為應(yīng)用添加日志功能。應(yīng)用Log4net,使用者可以很精確地控制日志信息的輸出,減少了多余信息,提高了日志記錄性能。同時(shí),通過(guò)外部配置文件,用戶可以不用重新編譯程序就能改變應(yīng)用的日志行為,使得用戶可以根據(jù)情況靈活地選擇要記錄的信息。

以上就對(duì)ASP.NET調(diào)試API:log4net進(jìn)行了介紹。

【編輯推薦】

  1. ASP.NET調(diào)用WCF服務(wù)
  2. 淺析ASP.NET驗(yàn)證控件
  3. ASP.NET中WCF服務(wù)與ASMX服務(wù)的兼容性
  4. 詳解ASP.NET應(yīng)用程序
  5. ASP.NET的HttpModule
責(zé)任編輯:yangsai 來(lái)源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2009-10-26 19:22:29

VB.NET使用Log

2009-07-28 17:17:19

ASP.NET概述

2024-12-04 08:17:49

日志框架NLog

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設(shè)計(jì)

2009-07-22 16:34:36

使用T4ASP.NET MVC

2009-08-03 13:38:18

ASP.NET編程模型

2011-06-01 15:54:41

log4net

2011-06-01 16:08:29

log4Net

2009-08-03 14:22:33

什么是ASP.NET

2009-07-22 17:45:35

ASP.NET教程

2009-08-27 16:59:20

ASP.NET用戶控件

2024-06-11 09:00:00

異步編程代碼

2009-09-18 09:23:21

ASP.NET 4自動(dòng)啟動(dòng)

2009-08-10 14:08:15

ASP.NET服務(wù)器控ASP.NET組件設(shè)計(jì)

2009-07-27 09:45:14

ASP.NET Dro

2009-07-23 15:44:39

ASP.NET MVC

2009-08-10 14:55:43

ASP.NET htt

2009-08-03 10:07:20

ASP.NET Ses

2009-07-29 13:12:36

StringBuildASP.NET技巧

2009-08-06 15:21:45

ASP.NET控件開發(fā)RenderConte
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩人妻精品一区二区三区| 2019精品视频| 欧美精品色视频| 欧美精品videosex| 91婷婷韩国欧美一区二区| 国产99久久精品一区二区永久免费 | 亚洲网站啪啪| 国产亚洲精品一区二区| 久久久久亚洲av无码专区首jn| 午夜影院在线播放| 亚洲三级久久久| 国产精品亚洲不卡a| 中文字幕在线2018| 亚洲精品男同| 久久艳片www.17c.com| 国产精品成人一区二区三区电影毛片 | 亚洲人成在线观看一区二区| 久久国产精品精品国产色婷婷| 中文字幕丰满人伦在线| 99精品福利视频| 久久中文字幕一区| 国产综合精品在线| 日本福利一区| 欧美videos中文字幕| 91极品尤物在线播放国产| 麻豆视频在线看| 亚洲人成精品久久久久| 久久综合九色99| 亚洲精品国产精品国| 美女视频网站久久| 国产成人精品免费视频| 久热这里只有精品6| 中国成人一区| 久久久999精品视频| 91视频免费在观看| 啄木系列成人av电影| 亚洲成人国产精品| 激情av中文字幕| 亚洲图色一区二区三区| 精品区在线观看| 欧美岛国激情| 综合国产在线视频| 久久久久亚洲av成人无码电影| 激情视频极品美女日韩| 日韩欧美亚洲一区二区| 奇米777在线视频| 天堂综合在线播放| 欧美日韩国产免费一区二区| 91淫黄看大片| 92国产精品| 色综合久久综合网欧美综合网 | 在线这里只有精品| 人人妻人人添人人爽欧美一区| 青春草在线免费视频| 亚洲三级电影全部在线观看高清| 五月天亚洲综合| 丁香在线视频| 中文字幕第一区二区| 特级西西444www大精品视频| 成年人视频免费在线观看| 久久夜色精品国产欧美乱极品| 精品国产免费一区二区三区 | 久久成人精品电影| 久久久久久视频| 在线成人激情| 欧美国产日韩一区二区| 国产在线免费视频| 国产农村妇女毛片精品久久莱园子 | 亚洲国产精品免费在线观看| 欧美一区网站| 久久久噜噜噜久久久| 国产欧美日韩另类| 天堂精品中文字幕在线| 国产精品美女久久久久久免费| 国产午夜麻豆影院在线观看| 日本成人在线一区| 91社区国产高清| 国产77777| 久久久久久久久久电影| 一区二区三区四区欧美| 中文在线免费| 精品久久久中文| 男人插女人下面免费视频| 日本成人在线网站| 欧美成人video| 天堂久久精品忘忧草| 亚洲综合专区| 欧美一级黑人aaaaaaa做受| 国产精品第6页| 国产精品一品视频| 欧美精品一区二区视频| 老司机午夜在线| 天天影视网天天综合色在线播放| 手机看片福利盒子久久| 国产精品久久久久久av公交车| 欧美成人福利视频| 国产午夜精品福利视频| 国产精品sm| 国产精品成人aaaaa网站| 超碰在线观看99| 国产欧美精品国产国产专区 | 美女国产精品| 91精品国产高清久久久久久91裸体 | 国产一区二区三区影院| 美国av一区二区| 狠狠色伊人亚洲综合网站色| 欧美69xxx| 色综合天天综合网天天狠天天| 五月天六月丁香| 日本电影一区二区| 91av视频在线| 成人av无码一区二区三区| 国产亚洲一区二区在线观看| 91免费国产精品| 成人免费黄色| 亚洲精品一区二区网址| 看片网站在线观看| 麻豆91在线观看| 久久久久久一区| 美洲精品一卡2卡三卡4卡四卡| 欧美亚洲动漫精品| 亚洲第一黄色网址| 国内在线观看一区二区三区| 国产美女主播一区| 成人免费在线观看| 你懂的视频在线免费| 久久99国产精品免费网站| 欧美精品v日韩精品v国产精品| av免费在线免费观看| 欧美在线观看视频一区二区| 美国黄色a级片| 亚洲福利电影| 91aaaa| 成人午夜在线影视| 欧美精品精品一区| 亚洲怡红院在线观看| 日本亚洲最大的色成网站www| 国产一区自拍视频| 波多野结衣中文字幕久久| 日韩一级视频免费观看在线| 夫妻性生活毛片| 精品一区二区三区免费| 午夜精品一区二区三区四区 | 亚洲天天综合| 国产日产亚洲精品| 91精品专区| 欧美色图片你懂的| ass极品国模人体欣赏| 日本美女视频一区二区| 日本婷婷久久久久久久久一区二区| 伊人成综合网站| 亚洲欧美精品一区二区| 无码人妻av一区二区三区波多野 | 欧美日韩免费做爰视频| 国产精品一区免费视频| 国产午夜精品视频一区二区三区| 国产精品一区二区三区四区在线观看 | 日本暖暖在线视频| 欧美男同性恋视频网站| 午夜精品一区二区三级视频| 激情图区综合网| 久久久久久久久久久综合| 久草在线综合| 国产97在线观看| 超碰97在线免费观看| 欧美性猛交一区二区三区精品| 国产调教在线观看| 狠狠色综合播放一区二区| 久久福利一区二区| 私拍精品福利视频在线一区| 国产精品9999| 黄网站app在线观看| 日韩欧美一级精品久久| 国产精品视频久久久久久久| 日本一区二区视频在线| 国产精品嫩草影视| 在线 亚洲欧美在线综合一区| 久久综合伊人77777麻豆| 91精品国产66| 色综合久久88| 九色在线免费| 日韩免费观看高清完整版在线观看| 欧美日韩综合在线观看| 中文字幕第一区二区| 中国男女全黄大片| 视频在线观看一区二区三区| 欧美亚洲视频一区| 日本韩国欧美超级黄在线观看| 国产噜噜噜噜噜久久久久久久久| 污视频网站在线免费| 亚洲精品网站在线播放gif| 一二三四区在线| 亚洲国产欧美在线人成| 五月天婷婷丁香网| 成人黄色大片在线观看| 手机视频在线观看| 在线亚洲自拍| 天天干天天操天天干天天操| 性人久久久久| 91免费看网站| 美女色狠狠久久| 国a精品视频大全| 黄av在线播放| 国产亚洲欧美日韩精品| 亚洲不卡免费视频| 欧美日韩国产高清一区二区三区| 日韩免费观看一区二区| 亚洲少妇屁股交4| japanese中文字幕| 国产sm精品调教视频网站| 色综合天天色综合| 亚洲在线黄色| 久久99久久99精品| 亚洲五月综合| 一区不卡字幕| 国产精品欧美三级在线观看| 国产另类自拍| 亚洲三区欧美一区国产二区| 国产精品一二区| 台湾佬中文娱乐久久久| 992tv成人免费影院| 2024最新电影在线免费观看| 日韩三级影视基地| a视频网址在线观看| 亚洲色图五月天| 天堂a中文在线| 亚洲国产97在线精品一区| 91中文字幕在线播放| 欧美性videosxxxxx| 特级毛片www| 欧美午夜影院在线视频| 亚洲一区欧美在线| 亚洲va国产天堂va久久en| 久久婷婷综合国产| 亚洲精品久久嫩草网站秘色| 国产精品suv一区二区88| 国产精品素人视频| 亚洲无人区码一码二码三码的含义| 久久这里都是精品| 3d动漫精品啪啪一区二区下载| av爱爱亚洲一区| 人妻换人妻a片爽麻豆| 国产激情精品久久久第一区二区| 久久精品久久99| 国产一区啦啦啦在线观看| 做a视频在线观看| 激情国产一区二区| 伊人精品视频在线观看| 韩国毛片一区二区三区| 亚洲一级片av| 国产精品资源网站| 国产一精品一aⅴ一免费| 成人一区二区视频| av网站有哪些| 久久精品一区二区三区不卡| 少妇av片在线观看| 国产精品传媒在线| 成人免费黄色小视频| 一区二区三区不卡在线观看 | 一区二区三区四区五区| 亚洲欧美色一区| 国产性70yerg老太| 精品久久久香蕉免费精品视频| 一级做a爰片久久毛片| 91福利国产精品| 国产精品一区二区av白丝下载| 91精品国产免费| 欧美 日韩 国产 成人 在线 91| 日韩高清人体午夜| www.91在线| 欧美日韩国产999| 伊人久久综合一区二区| 国产欧美精品日韩| 中文字幕日韩在线| 欧美精品在线一区| 888久久久| 日本网站免费在线观看| 日本亚洲一区二区| 台湾佬美性中文| 久久久国产午夜精品| 国产精品国产三级国产传播| 亚洲妇女屁股眼交7| 免费看av在线| 日韩精品一区二区三区三区免费 | 国产精品成人免费| 久久婷婷综合国产| 欧美亚洲愉拍一区二区| 国产后入清纯学生妹| 日韩精品中文字幕有码专区| 在线日本视频| 97色在线观看| 天天综合91| 免费精品视频一区二区三区| 99久久亚洲精品| 人妻有码中文字幕| 国产精品一区二区91| 国产美女免费网站| 亚洲一二三专区| 在线视频欧美亚洲| 亚洲精品久久久久| 黄视频网站在线| 国产成人精品久久二区二区| 91嫩草精品| 亚洲日本理论电影| 国产日韩欧美高清免费| 日本一本在线视频| 日本一区二区三区四区| 国产精品自拍视频一区| 欧美挠脚心视频网站| 狠狠v欧美ⅴ日韩v亚洲v大胸 | 亚洲女人天堂网| 日本在线视频www鲁啊鲁| 国产精品一区电影| 免费成人网www| 欧美午夜小视频| 国产老妇另类xxxxx| 免费福利视频网站| 欧美丝袜第一区| 成人精品在线播放| 久久国产精品电影| 国产三级一区| 日韩国产精品一区二区| 中国女人久久久| 一区二区三区四区影院| 一区二区三区在线观看动漫 | 国产私拍福利精品视频二区| 国产精品一区二区三区精品| 欧美一区精品| 成人在线短视频| 自拍偷拍亚洲综合| 一区二区三区免费在线视频| 一本色道久久88综合亚洲精品ⅰ| 人人草在线视频| 精品国产二区在线| 亚洲少妇一区| 最近中文字幕无免费| 亚洲va在线va天堂| 天堂在线视频网站| 97国产suv精品一区二区62| 涩爱av色老久久精品偷偷鲁| 福利在线小视频| 国产精品自拍三区| 欧美黑吊大战白妞| 精品成人a区在线观看| 国产白丝在线观看| 国内视频一区二区| 国产欧美日韩亚洲一区二区三区| 俄罗斯黄色录像| 亚洲成a人片综合在线| 日本免费一区视频| 4388成人网| 欧洲乱码伦视频免费| 天堂av在线网站| 亚洲日本在线a| 精品久久久久久亚洲综合网站 | 亚洲精品91美女久久久久久久| 99爱在线观看| 欧美亚州在线观看| 日韩av高清在线观看| 色偷偷www8888| 日韩欧美一级二级| 色偷偷色偷偷色偷偷在线视频| 美日韩免费视频| 蜜桃久久久久久久| 国产盗摄x88av| 亚洲精品国产美女| 福利一区二区三区视频在线观看| 中文字幕成人一区| 风间由美一区二区三区在线观看| 日产精品久久久久| 亚洲人成电影网| 在线观看欧美| 久久综合久久网| 久久精品男人天堂av| 一级黄色大片免费| 欧美激情网站在线观看| 国产精品自拍区| 在线观看免费视频污| 五月天激情综合| 自拍视频在线网| 国产一区在线免费观看| 免费一区二区视频| 久久午夜无码鲁丝片| 亚洲欧美日韩天堂| 日韩免费在线电影| 男人的天堂狠狠干| 国产精品私人影院| 人妻中文字幕一区| 国产精品午夜视频| 影院欧美亚洲| 亚洲精品电影院| 日韩av影片在线观看| 成人午夜888| 久久九九国产视频| 一级精品视频在线观看宜春院| 狠狠v欧美ⅴ日韩v亚洲v大胸| 99伊人久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久精品久久国产| 日韩最新av在线|