superwei

          導(dǎo)航

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

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

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

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

          2 log4net概述  

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

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

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

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

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

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

          3.1.1 Logger的管理方式

           

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

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

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

           

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

           

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

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

           

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

          3.2  Logger Levellog級別  

          從上面的ILog的接口可以看出,log4net5種不同的記錄方式。為什么需要有這5種記錄方式呢?其實,這5種記錄方式存在不同的優(yōu)先級別。這些級別定義在log4net.spi.level中。可以根據(jù)需要在應(yīng)用中使用任意一個方法,但是,為了在使用了這些方法之后,在回收時不至于浪費太多的CPU周期。因此,log4net提供了7個等級以及它們各自的布爾屬性來節(jié)省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會通過配置文件中的配置信息給予一個優(yōu)先級別,如果沒有指定的優(yōu)先級別,那么它將嘗試從它的父類中繼承一個優(yōu)先級別。同樣,Logger的每一個方法都有一個預(yù)定義的級別,如上表中列出的,Info()方法有著INFO的級別。當運行時,log4net會檢查方法的級別以及配置文件賦予Logger的級別,然后執(zhí)行不同的操作。例如,假設(shè)某個Logger具有INFO的級別,那么當執(zhí)行如下操作時: 

          Logger.Info(“message”);
          

           

          Logger.Debug(“message”);
          

           

          Logger.Warn(“message”);
          

           

          將會有如下的情況:

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

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

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

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

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

          if (logger.IsDebugEnabled){
          

           

           Logger.Debug("message");
          

           

          }
          

           

          3.3  Appenderlog目的地  

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

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

          Root Logger擁有目標為System.consoleconsoleAppender,故默認情況下,所有的Logger都將繼承該appender 

          3.4  Layoutlog格式化器  

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

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

          3.5  Configuration:配置信息  

          log4net環(huán)境的配置就是對Root Logger的配置,包括把Root Logger設(shè)置為哪個級別(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非常簡單,完全不需要改變.net應(yīng)用程序的結(jié)構(gòu),只需要為項目添加log4net引用,配置config文件,實例化一個Logger實例,在需要輸出log的地方調(diào)用Logger的方法即可。使用log4net最重要的地方是config文件的配置。 

          4.1  config文件配置 

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

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

          輸出log到文本文件,需要在config文件中指定log文件的存放路徑,文件名稱,log輸出格式,文本文件達到多大時重新創(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 小辭猬 閱讀(1923) 評論(0)  編輯  收藏 所屬分類: DoNet

          主站蜘蛛池模板: 普兰店市| 永德县| 崇州市| 通州区| 凤山县| 崇明县| 巢湖市| 宝丰县| 宁波市| 辽阳市| 慈利县| 札达县| 老河口市| 海丰县| 柘荣县| 常州市| 满城县| 威信县| 临猗县| 扶风县| 大田县| 石林| 福安市| 谢通门县| 弥勒县| 隆德县| 东台市| 田林县| 炎陵县| 云龙县| 陕西省| 克什克腾旗| 南昌县| 十堰市| 廊坊市| 安远县| 白山市| 青田县| 东源县| 姜堰市| 巴林左旗|