superwei

          導航

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

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          .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.Firstlogger.First.One的祖先,同時logger.First.One繼承了logger.First的屬性。位于命名空間最高層的Logger是默認Logger,也被稱為根LoggerRoot Logger)。 

          3.1.2 實現自己的Logger

           

          如果要實現自己的Logger,那么log4net提供了接口ILog用于實現自己的LoggerILog的大致結構如下: 

          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的類給我們用于獲取或者創建一個LoggerLogManager提供了方法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 Levellog級別  

          從上面的ILog的接口可以看出,log4net5種不同的記錄方式。為什么需要有這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的級別等于LoggerINFO級別,那么Info方法將執行; 

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

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

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

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

          if (logger.IsDebugEnabled){
          

           

           Logger.Debug("message");
          

           

          }
          

           

          3.3  Appenderlog目的地  

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

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

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

          3.4  Layoutlog格式化器  

          每個appender都和一個layout相聯系;layout的任務是格式化用戶的logging requestLayout使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] 
          &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

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

           

          <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

          主站蜘蛛池模板: 青神县| 乌兰县| 武夷山市| 象州县| 公主岭市| 丰县| 皋兰县| 佳木斯市| 普安县| 留坝县| 靖远县| 通州市| 铁岭县| 年辖:市辖区| 扬中市| 巨鹿县| 岑巩县| 临安市| 乌兰察布市| 山东省| 临海市| 宜良县| 武强县| 民和| 福建省| 洛浦县| 西平县| 民乐县| 安图县| 沂源县| 东安县| 贵州省| 和顺县| 栾川县| 大足县| 竹山县| 龙川县| 广丰县| 河南省| 木兰县| 耿马|