<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    superwei

    導(dǎo)航

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

    統(tǒng)計(jì)

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    .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)大且方法簡單的處理方法,不但能保證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)本身的代碼,它們之間的綁定非常簡單,并且log4net處理log信息是和應(yīng)用系統(tǒng)同步的,其處理速度和輸出的多樣性也是其它任何log處理系統(tǒng)無法比擬的。log4net最有特色的地方是,它對log進(jìn)行了分等級處理,這樣應(yīng)用系統(tǒng)可以在實(shí)際運(yùn)行環(huán)境下很簡單的輸出不同級別的log信息,幫助系統(tǒng)開發(fā)維護(hù)人員在最快的時(shí)間里得到最有用的系統(tǒng)log信息。 

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

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

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

    在使用log4net之前先了解log4net的結(jié)構(gòu)是非常有必要的,下面簡要分析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將自動創(chuàng)建一個(gè)。通常情況下,都是使用Logger所在類的名稱來作為Logger的名稱,即GetLogger方法的參數(shù)可以是typeof(ClassName)。也可以使用如下的方法來傳遞該參數(shù): 

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

     

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

    3.2  Logger Levellog級別  

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

    Logger.Info(“message”);
    

     

    Logger.Debug(“message”);
    

     

    Logger.Warn(“message”);
    

     

    將會有如下的情況:

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

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

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

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

    在上表中還定義了兩個(gè)特殊的級別: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級別、log時(shí)間、線程、異常信息等。 

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

    3.5  Configuration:配置信息  

    log4net環(huán)境的配置就是對Root Logger的配置,包括把Root Logger設(shè)置為哪個(gè)級別(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),只需要為項(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文件的配置方法在這兩種情況下都是相同的,所以可以很簡單的將一個(gè)config文件從Application項(xiàng)目移植到Web項(xiàng)目中。前面介紹過的將log輸出到文本文件、數(shù)據(jù)庫、XML文件等多種輸出形式,以及log輸出的多種樣式等,在應(yīng)用程序中只需要配置config文件即可實(shí)現(xiàn),完全不用改動程序。下面介紹將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) 評論(0)  編輯  收藏 所屬分類: DoNet

    主站蜘蛛池模板: 日本一区二区三区日本免费| 免费国产在线精品一区| 久章草在线精品视频免费观看| 四虎永久在线免费观看| 亚洲a无码综合a国产av中文| 在线播放高清国语自产拍免费| 成人免费AA片在线观看| 亚洲一级片在线播放| 亚洲三级高清免费| 亚洲人成在线播放| 成年人免费观看视频网站| 亚洲色少妇熟女11p| 免费毛片在线视频| 国产产在线精品亚洲AAVV| 亚洲国产成人VA在线观看| 无码一区二区三区亚洲人妻| 四虎AV永久在线精品免费观看| 无套内谢孕妇毛片免费看看| 国产免费人成视频在线观看| 美女免费精品高清毛片在线视| 亚洲Av无码乱码在线播放| 国产亚洲av人片在线观看| 亚洲AV无码专区在线播放中文| 黄色a三级免费看| 国产一区二区免费| 热99re久久精品精品免费| 亚洲国产欧美日韩精品一区二区三区 | 久久最新免费视频| 在线看片无码永久免费视频| 亚洲人成片在线观看| 麻花传媒剧在线mv免费观看| 亚洲AV成人一区二区三区在线看| 亚洲一区二区三区无码中文字幕| 爽爽日本在线视频免费| 男人的天堂亚洲一区二区三区| 成人免费视频小说| 亚洲成年人免费网站| 国内精品免费视频自在线| 老司机午夜免费视频| 久久亚洲国产午夜精品理论片| 最好看的中文字幕2019免费|