superwei

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          .NET環(huán)境下log處理解決方案(Log4Net)

          載自:http://blog.csdn.net/zyc21st/archive/2006/03/27/639820.aspx
          1
          實(shí)現(xiàn)目的  

          一個(gè)好的應(yīng)用系統(tǒng)離不開log文件的支持,所以log文件的處理在應(yīng)用系統(tǒng)的開發(fā)過程中是占很大比重的。log文件的處理方法有很多種,采用一種功能強(qiáng)大且方法簡(jiǎn)單的處理方法,不但能保證log文件的輸出質(zhì)量,更能大大縮短系統(tǒng)開發(fā)和維護(hù)的周期。本文介紹的.net環(huán)境下log文件處理解決方案,采用的是開源日志框架log4net。本文介紹的log4net基于log4net-1.2.0版本。 

          2 log4net概述  

          log4net是一個(gè)輔助應(yīng)用系統(tǒng)輸出多種樣式log信息的日志框架,它是著名的log4j框架在.net環(huán)境下的實(shí)現(xiàn),在實(shí)際應(yīng)用中,可以采用和log4j類似的方法在.net環(huán)境下構(gòu)建起一個(gè)功能強(qiáng)大的log處理系統(tǒng)。log4net和應(yīng)用系統(tǒng)的結(jié)合不需要修改應(yīng)用系統(tǒng)本身的代碼,它們之間的綁定非常簡(jiǎn)單,并且log4net處理log信息是和應(yīng)用系統(tǒng)同步的,其處理速度和輸出的多樣性也是其它任何log處理系統(tǒng)無法比擬的。log4net最有特色的地方是,它對(duì)log進(jìn)行了分等級(jí)處理,這樣應(yīng)用系統(tǒng)可以在實(shí)際運(yùn)行環(huán)境下很簡(jiǎn)單的輸出不同級(jí)別的log信息,幫助系統(tǒng)開發(fā)維護(hù)人員在最快的時(shí)間里得到最有用的系統(tǒng)log信息。 

          log4net處理log文件的方法是靈活多變的,它可以將log信息輸出不同的樣式和輸出到不同的地方,如控制臺(tái)(Console),文本文件,XML文件,以流的形式發(fā)送到其它地方(如數(shù)據(jù)庫),發(fā)送到電子郵件中,根據(jù)天數(shù)或者文件大小產(chǎn)生新的文件等等。并且開發(fā)人員可以根據(jù)自己的喜好格式化log輸出,如自由指定樣式,可以包含log級(jí)別與log信息,包含log時(shí)間、線程、類別等信息的樣式等等。 

          本文以最常見的log輸出形式:輸出到文本文件和數(shù)據(jù)庫作為范例來介紹log4net的使用方法 

          3 log4net 主要結(jié)構(gòu)分析  

          在使用log4net之前先了解log4net的結(jié)構(gòu)是非常有必要的,下面簡(jiǎn)要分析log4net結(jié)構(gòu)中重要的幾個(gè)部分。 

          3.1 Logger Logger是應(yīng)用程序與log4net交互的主要模塊,它也是log4net生成log的模塊。Logger主要負(fù)責(zé)得到log信息,得到log信息之后接下來的顯示log則是在Layout模塊中處理。 

          3.1.1 Logger的管理方式

           

          Logger提供了多種方法用于記錄任何類型的log信息,可以在應(yīng)用程序中使用多個(gè)Logger實(shí)例,而把它們的維護(hù)工作交給log4net框架作為“命名實(shí)體(Named Entity)”進(jìn)行維護(hù)。這就意味著,不再需要將應(yīng)用程序中生成的Logger實(shí)例作為參數(shù)在應(yīng)用程序中傳遞,以便應(yīng)用程序中的其它模塊能使用該實(shí)例。唯一需要做的就是通過Logger的命名來調(diào)用它。

          目前,log4net使用類似.net命名空間的方式管理命名實(shí)體。例如,有兩個(gè)Logger,分別定義為logger.First以及logger.First.One。那么這兩個(gè)是不同的Logger,而且logger.Firstlogger.First.One的祖先,同時(shí)logger.First.One繼承了logger.First的屬性。位于命名空間最高層的Logger是默認(rèn)Logger,也被稱為根LoggerRoot Logger)。 

          3.1.2 實(shí)現(xiàn)自己的Logger

           

          如果要實(shí)現(xiàn)自己的Logger,那么log4net提供了接口ILog用于實(shí)現(xiàn)自己的LoggerILog的大致結(jié)構(gòu)如下: 

          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提供了一個(gè)名為LogManager的類給我們用于獲取或者創(chuàng)建一個(gè)LoggerLogManager提供了方法GetLogger(),該方法接收一個(gè)string類型的參數(shù),用于指定Logger的名稱: 
          log4net.ILog log = log4net.LogManager.GetLogger(Logger_Name) ;
          

           

          當(dāng)指定名稱的Logger不存在時(shí),LogManager將自動(dòng)創(chuàng)建一個(gè)。通常情況下,都是使用Logger所在類的名稱來作為Logger的名稱,即GetLogger方法的參數(shù)可以是typeof(ClassName)。也可以使用如下的方法來傳遞該參數(shù): 

          log4net.Ilog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
          

           

          盡管上面的代碼比typeof(ClassName)要長(zhǎng)的多,但是這樣做可以在任何一個(gè)類中使用相同的方法傳遞參數(shù),從而減少出錯(cuò)的機(jī)率。 

          3.2  Logger Levellog級(jí)別  

          從上面的ILog的接口可以看出,log4net5種不同的記錄方式。為什么需要有這5種記錄方式呢?其實(shí),這5種記錄方式存在不同的優(yōu)先級(jí)別。這些級(jí)別定義在log4net.spi.level中。可以根據(jù)需要在應(yīng)用中使用任意一個(gè)方法,但是,為了在使用了這些方法之后,在回收時(shí)不至于浪費(fèi)太多的CPU周期。因此,log4net提供了7個(gè)等級(jí)以及它們各自的布爾屬性來節(jié)省CPU周期,如下: 

          Logger的不同等級(jí): 

          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中,每一個(gè)Logger會(huì)通過配置文件中的配置信息給予一個(gè)優(yōu)先級(jí)別,如果沒有指定的優(yōu)先級(jí)別,那么它將嘗試從它的父類中繼承一個(gè)優(yōu)先級(jí)別。同樣,Logger的每一個(gè)方法都有一個(gè)預(yù)定義的級(jí)別,如上表中列出的,Info()方法有著INFO的級(jí)別。當(dāng)運(yùn)行時(shí),log4net會(huì)檢查方法的級(jí)別以及配置文件賦予Logger的級(jí)別,然后執(zhí)行不同的操作。例如,假設(shè)某個(gè)Logger具有INFO的級(jí)別,那么當(dāng)執(zhí)行如下操作時(shí): 

          Logger.Info(“message”);
          

           

          Logger.Debug(“message”);
          

           

          Logger.Warn(“message”);
          

           

          將會(huì)有如下的情況:

          1、 方法Info的級(jí)別等于LoggerINFO級(jí)別,那么Info方法將執(zhí)行; 

          2、 方法Debug的級(jí)別低于LoggerINFO級(jí)別,那么Debug方法將不執(zhí)行或拋出異常; 

          3、方法Warn的級(jí)別高于LoggerINFO級(jí)別,那么Warn方法將被執(zhí)行。 

          由此可以看出,當(dāng)方法的級(jí)別大于或等于Logger的級(jí)別時(shí),方法將得以執(zhí)行。 

          在上表中還定義了兩個(gè)特殊的級(jí)別:ALLOFFALL意味著任何方法都可以執(zhí)行,OFF則相反。為了明確那些操作能夠執(zhí)行,可以用上表中的屬性進(jìn)行判斷: 

          if (logger.IsDebugEnabled){
          

           

           Logger.Debug("message");
          

           

          }
          

           

          3.3  Appenderlog目的地  

          每個(gè)Logger都可以擁有一個(gè)或者多個(gè)appender,每個(gè)appender表示一個(gè)log的輸出目的地,比如console、某個(gè)文件、數(shù)據(jù)庫甚至電子郵件。可以使用Logger.addAppender(Appender app)logger增加一個(gè)appender;也可以使用Logger.removeAppender(Appender app)logger移除一個(gè)appender 

          默認(rèn)情況下,Loggeradditive標(biāo)志被設(shè)置為true,表示子Logger將繼承父Logger的所有appenders。該選項(xiàng)可以被重置,表示子Logger將不再繼承父Loggerappenders 

          Root Logger擁有目標(biāo)為System.consoleconsoleAppender,故默認(rèn)情況下,所有的Logger都將繼承該appender 

          3.4  Layoutlog格式化器  

          每個(gè)appender都和一個(gè)layout相聯(lián)系;layout的任務(wù)是格式化用戶的logging requestLayout使log的輸出樣式多樣,比如可以在輸出的log信息中包含log級(jí)別、log時(shí)間、線程、異常信息等。 

          appender的任務(wù)是把layout格式化好的輸出內(nèi)容送往指定的目的地。 

          3.5  Configuration:配置信息  

          對(duì)log4net環(huán)境的配置就是對(duì)Root Logger的配置,包括把Root Logger設(shè)置為哪個(gè)級(jí)別(level);為它增加哪些appender,等等。這些可以通過設(shè)置系統(tǒng)屬性的方法來隱式地完成,也可以在程序里調(diào)用XXXConfigurator.configure()方法來顯式地完成。以上介紹的幾部分是log4net中最主要的幾部分,在使用log4net之前了解這幾部分的主要結(jié)構(gòu)和作用非常有助于更好的使用log4net。下面介紹log4net.net應(yīng)用程序中的使用方法。

          4 Log4net的使用方法  

          .net應(yīng)用程序中使用log4net非常簡(jiǎn)單,完全不需要改變.net應(yīng)用程序的結(jié)構(gòu),只需要為項(xiàng)目添加log4net引用,配置config文件,實(shí)例化一個(gè)Logger實(shí)例,在需要輸出log的地方調(diào)用Logger的方法即可。使用log4net最重要的地方是config文件的配置。 

          4.1  config文件配置 

          Application項(xiàng)目中,log4net默認(rèn)讀取配置信息的文件是App.config,在Web項(xiàng)目中默認(rèn)讀取配置信息的文件是Web.config。但是config文件的配置方法在這兩種情況下都是相同的,所以可以很簡(jiǎn)單的將一個(gè)config文件從Application項(xiàng)目移植到Web項(xiàng)目中。前面介紹過的將log輸出到文本文件、數(shù)據(jù)庫、XML文件等多種輸出形式,以及log輸出的多種樣式等,在應(yīng)用程序中只需要配置config文件即可實(shí)現(xiàn),完全不用改動(dòng)程序。下面介紹將log輸出到文本文件和數(shù)據(jù)庫的config文件配置方法。 

          4.1.1 輸出log到文本文件的config文件配置  

          輸出log到文本文件,需要在config文件中指定log文件的存放路徑,文件名稱,log輸出格式,文本文件達(dá)到多大時(shí)重新創(chuàng)建文件等等,如下: 

          <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] 
          &lt;%X{auth}&gt; - %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

          件中的配置信息,一般來說,這一部分在所有的應(yīng)用中是相同的。

           

          <appender></appender>中間的部分分析:

           

          這一部分首先定義了type="log4net.Appender.FileAppender"是指要輸出的log將寫入到文件(File)中,如果是寫入到數(shù)據(jù)庫中,這里將這樣配置:

           

          <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 小辭猬 閱讀(1925) 評(píng)論(0)  編輯  收藏 所屬分類: DoNet

          主站蜘蛛池模板: 和平区| 锡林浩特市| 竹北市| 郴州市| 镇远县| 龙江县| 富蕴县| 大悟县| 五河县| 应城市| 司法| 房山区| 闻喜县| 兰西县| 五河县| 连云港市| 阳西县| 赫章县| 天峨县| 西林县| 安阳市| 灌云县| 稷山县| 北辰区| 彭山县| 肥东县| 阿瓦提县| 武隆县| 宁化县| 安多县| 新绛县| 雅安市| 怀来县| 琼海市| 区。| 宁城县| 常州市| 蓬莱市| 云阳县| 广元市| 韩城市|