亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Log4Net介紹

系統(tǒng) 2660 0

1 簡介

1.1 Log4net的優(yōu)點:

幾乎所有的大型應(yīng)用都會有自己的用于跟蹤調(diào)試的API。因為一旦程序被部署以后,就不太可能再利用專門的調(diào)試工具了。然而一個管理員可能需要有一套強大的日志系統(tǒng)來診斷和修復(fù)配置上的問題。

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

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

1.2 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(庫), Appender(附著器)以及 Layout(布局).

2.1 Logger

2.1.1 Logger接口

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

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

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

ILog接口的定義如下:

public interface ILog

{

void Debug(object message);

void Info(object message);

void Warn(object message);

void Error(object message);

void Fatal(object message);

//以上的每一個方法都有一個重載的方法,用來支持異常處理。

//每一個重載方法都如下所示,有一個異常類型的附加參數(shù)。

void Debug(object message, Exception ex);

// ...

//Boolean 屬性用來檢查Logger的日志級別

//(我們馬上會在后面看到日志級別)

bool isDebugEnabled;
bool isInfoEnabled;

//… 其他方法對應(yīng)的Boolean屬性

}

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

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

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

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

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

2.1.2 日志的級別

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

Level 有以下幾種取值

級別

允許的方法

Boolean 屬性

優(yōu)先級別

OFF

Highest

FATAL

void Fatal(...);

bool IsFatalEnabled;

RROR

void Error(...);

bool IsErrorEnabled;

WARN

void Warn(...);

bool IsWarnEnabled;

INFO

void Info(...);

bool IsInfoEnabled;

DEBUG

void Debug(...);

bool IsDebugEnabled;

ALL

Lowest

1 Logger 的日志級別

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

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

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

Logger.Info("message");
Logger.Debug("message");
Logger.Warn("message");

對于第一種方法,Info()的級別等與日志的級別(INFO),因此日志請求會被傳遞,我們可以得到輸出結(jié)果”message”。

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

在表1中有兩個特殊的級別:ALL和OFF。ALL表示允許所有的日志請求。OFF是拒絕所有的請求。

你也可以顯式地檢查Logger對象的Boolean屬性,如下所示:

if (logger.IsDebugEnabled)
{
Logger.Debug("message");
}

2.2 Repository

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

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

2.3Appender

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

2.4 Appender Filters

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

2.5 Layout

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

3 在程序中使用log4net

3.1. 在自己的項目中添加對 log4net.dll 的引用。
3.2. 設(shè)置配置文件App.config

示例:

<? xmlversion="1.0"encoding="utf-8" ?>
< configuration >
<!-- 如果不用App.config作配置文件,則configSections節(jié)不是必須的。 -->
< configSections >
<!-- “type”屬性的完整格式為:配置節(jié)處理器類名,程序集名稱,Version=程序集版本號,Culture=區(qū)域信息,PublicKeyToken=公鑰 -->
< section name ="log4net" type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</ configSections >
< log4net >
<!-- 日志記錄器logger,可以有多個 -->
< logger name ="AppLogger" >
< level value ="INFO" />
< appender-ref ref ="LogFileAppender" />
< appender-ref ref ="ConsoleAppender" />
</ logger >
< logger name ="Form1" >
< level value ="DEBUG" />
< appender-ref ref ="LogFileAppender" />
</ logger >
<!-- 所有l(wèi)ogger的基,root的設(shè)置在所有l(wèi)ogger中都起作用。
當(dāng)在root和logger中重復(fù)設(shè)定相同的appender時,你會發(fā)現(xiàn)同一日志信息將被記錄兩次。
-->
<!-- <root>
<levelvalue="WARN"/>
<appender-refref="LogFileAppender"/>
<appender-refref="ConsoleAppender"/>
</root>
-->
<!-- 一個appender可以由多個logger共用,當(dāng)然一個logger可以指定多個appender。 -->
< appender name ="LogFileAppender" type ="log4net.Appender.FileAppender" >
< param name ="File" value ="App.log" />
< 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]%X{auth}-%m%n" />
</ layout >
< filter type ="log4net.Filter.LevelRangeFilter" >
< param name ="LevelMin" value ="DEBUG" />
< param name ="LevelMax" value ="FATAL" />
</ filter >
</ appender >
< appender name ="ConsoleAppender" type ="log4net.Appender.ConsoleAppender" >
< layout type ="log4net.Layout.PatternLayout" >
< param name ="ConversionPattern" value ="%d[%t]%-5p%c[%x]%X{auth}-%m%n" />
</ layout >
</ appender >
</ log4net >
</ configuration >

3.3 代碼里實現(xiàn)

private void btnLog_Click(object sender, System.EventArgs e)
{
log4net.ILog log = log4net.LogManager.GetLogger("AppLogger");
log.Debug("debug");
log.Info("info");
log.Warn("warn");
log.Error("error");
MessageBox.Show("生成日志成功!");
}



<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.cnblogs.com/ltp/archive/2005/12/03/289721.html" dc:identifier="http://www.cnblogs.com/ltp/archive/2005/12/03/289721.html" dc:title="在.net開發(fā)中使用Log4Net組件 " trackback:ping="http://www.cnblogs.com/ltp/services/trackbacks/289721.aspx" /> </rdf:RDF> -->

評論

我那你的代碼運行了一下,但是我不知道在那里看日志
回復(fù) 引用 查看

讀了你這篇文件,感覺很好,我也對這個組件了解了很多,但是我在測試你的代碼時,卻看不到日志文件的輸出,找了很最后在:AssemblyInfo.cs  中加入一句:[assembly: log4net.Config.XmlConfigurator(Watch=true)]
就看到我寫到文件中的日志了,但我不知道這個是什么意思,謝謝幫我解答一下!
回復(fù) 引用 查看

#3樓 2007-03-27 14:52 Ame
studying...
回復(fù) 引用 查看

#4樓 [TrackBack] 2007-03-29 18:48 erich.zhou
在.net開發(fā)中使用Log4Net組件 1簡介 1.1Log4net的優(yōu)點: 幾乎所有的大型應(yīng)用都會有自己的用于跟蹤調(diào)試的API。因為一旦程序被部署以后,就不太可能再利用專門的調(diào)試...
[引用提示]erich.zhou引用了該文章, 地址: http://www.cnblogs.com/erichzhou/archive/2007/03/29/693191.html
回復(fù) 引用 查看

#5樓 [TrackBack] 2007-07-10 10:23 落拓孤鴻
[引用提示]落拓孤鴻引用了該文章, 地址: http://www.cnblogs.com/cheatlove/archive/2007/07/10/812249.html
回復(fù) 引用 查看

Log4Net介紹


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 毛片a级 | 天天操天天射天天操 | 性欧美极品xxxx欧美一区二区 | 久久美| 性欧美成人依依影院 | 国产福利观看 | 奇米影视狠狠干 | 婷婷国产天堂久久综合五月 | 亚洲精品国产五月色 | 91在线精品视频 | 日日操日日操 | 国产福利精品在线 | 中文国产成人精品久久一区 | 亚洲精品视频网 | 91精品视频在线看 | 色综合久久亚洲国产日韩 | 91精品自在拍精选久久 | 久艾草国产成人综合在线视频 | 国产亚洲精品资源一区 | 国产精品久久在线观看 | 女人十六毛片 | 激情影院费观看 | 今天的恋爱未删减在线观看 | 欧美洲精品亚洲精品中文字幕 | 国产成人高清亚洲一区久久 | 亚洲激情网站 | 欧美成人69| 亚洲伦理中文字幕 | 亚洲精品综合一区二区三区 | 国产精品成人一区二区1 | 国产精品网页 | 久久久久久日本一区99 | 3d动漫精品成人一区二区三 | 久草视频免费在线看 | 亚洲精品亚洲人成毛片不卡 | 亚洲福利一区二区 | 婷婷性 | 亚洲五月综合缴情婷婷 | 免费99 | 国产l精品国产亚洲区久久 国产l精品国产亚洲区在线观看 | 日本美女视频韩国视频网站免费 |