log4net(Log For Net)是Apache開源的應用于.Net框架的日志記錄工具,詳細信息參見Apache網站.它是針對java的log4j(Log For Java的)姊妹工具.用過log4j的都知道,它功能強大,可配置性靈活,線程安全,對日志的輸出管理和級別管理方便。具體的使用方法往下看。
首先你應該下載log4net.dll并引入到你的項目References中,或者把源代碼項目作為你工程的一部分加入到你的工程當中。單擊這里下載Log4net 。
使用log4net需要知道其中兩個比較重要的概念:logger 和 appender。前者是日志記錄對象,后者是日志記錄的目標,包括控制臺,文件,定量大小的文件,遠程廣播。也就是說我們使用log4net的過程可以是這樣的:獲得一個用來記錄日志的工具對象logger,然后為logger對象指定日志的記錄位置.美妙的是,這一切工作都可以在Web.config配置文件中完成,所用的代碼極少。
幾乎所有的大型應用都會有自己的用于跟蹤調試的API。因為一旦程序被部署以后,就不太可能再利用專門的調試工具了。然而一個管理員可能需要有一套強大的日志系統來診斷和修復配置上的問題。
經驗表明,日志記錄往往是軟件開發周期中的重要組成部分。它具有以下幾個優點:它可以提供應用程序運行時的精確環境,可供開發人員盡快找到應用程序中的Bug;一旦在程序中加入了Log 輸出代碼,程序運行過程中就能生成并輸出日志信息而無需人工干預。另外,日志信息可以輸出到不同的地方(控制臺,文件等)以備以后研究之用。
Log4net就是為這樣一個目的設計的,用于.NET開發環境的日志記錄包。
用戶要在自己的程序里加入日志功能,只需將log4net.dll引入工程即可。
log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附著器)以及 Layout(布局)。
Logger是應用程序需要交互的主要組件,它用來產生日志消息。產生的日志消息并不直接顯示,還要預先經過Layout的格式化處理后才會輸出。
Logger提供了多種方式來記錄一個日志消息,你可以在你的應用程序里創建多個Logger,每個實例化的Logger對象都被log4net框架作為命名實體(named entity)來維護。這意味著為了重用Logger對象,你不必將它在不同的類或對象間傳遞,只需要用它的名字為參數調用就可以了。log4net框架使用繼承體系,繼承體系類似于.NET中的名字空間。也就是說,如果有兩個logger,分別被定義為a.b.c和a.b,那么我們說a.b是a.b.c的祖先。每一個logger都繼承了祖先的屬性
Log4net框架定義了一個ILog接口,所有的logger類都必須實現這個接口。如果你想實現一個自定義的logger,你必須首先實現這個接口。你可以參考在/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);
//以上的每一個方法都有一個重載的方法,用來支持異常處理。
//每一個重載方法都如下所示,有一個異常類型的附加參數。
void Debug(object message, Exception ex);
// ...
//Boolean 屬性用來檢查Logger的日志級別
//(我們馬上會在后面看到日志級別)
bool isDebugEnabled;
bool isInfoEnabled;
//… 其他方法對應的Boolean屬性
}
Log4net框架定義了一個叫做LogManager的類,用來管理所有的logger對象。它有一個GetLogger()靜態方法,用我們提供的名字參數來檢索已經存在的Logger對象。如果框架里不存在該Logger對象,它也會為我們創建一個Logger對象。代碼如下所示:
log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
通常來說,我們會以類(class)的類型(type)為參數來調用GetLogger(),以便跟蹤我們正在進行日志記錄的類。傳遞的類(class)的類型(type)可以用typeof(Classname)方法來獲得,或者可以用如下的反射方法來獲得:
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
盡管符號長了一些,但是后者可以用于一些場合,比如獲取調用方法的類(class)的類型(type)。
正如你在ILog的接口中看到的一樣,有五種不同的方法可以跟蹤一個應用程序。事實上,這五種方法是運作在Logger對象設置的不同日志優先級別上。這幾種不同的級別是作為常量定義在log4net.spi.Level類中。你可以在程序中使用任何一種方法。但是在最后的發布中你也許不想讓所有的代碼來浪費你的CPU周期,因此,框架提供了7種級別和相應的Boolean屬性來控制日志記錄的類型。
Level有以下幾種取值
級別 | 允許的方法 | Boolean屬性 | 優先級別 |
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 |
在log4net框架里,通過設置配置文件,每個日志對象都被分配了一個日志優先級別。如果沒有給一個日志對象顯式地分配一個級別,那么該對象會試圖從他的祖先繼承一個級別值。
ILog接口的每個方法都有一個預先定義好了的級別值。正如你在表1看到的,ILog的Inof()方法具有INFO級別。同樣的,以此類推,Error()方法具有ERROR級別。當我們使用以上的任何一種方法時,log4net框架會檢查日志對象logger的級別和方法的級別。只有當方法的級別高于日志級別時,日志請求才會被接受并執行。
舉例說明,當你創建了一個日志對象,并且把他的級別設置為INFO。于是框架會設置日志的每個Boolean屬性。當你調用相應的日志方法時,框架會檢查相應的Boolean屬性,以決定該方法能不能執行。如下的代碼:
Logger.Info("message");
Logger.Debug("message");
Logger.Warn("message");
對于第一種方法,Info()的級別等與日志的級別(INFO),因此日志請求會被傳遞,我們可以得到輸出結果”message”。
對于第二種方法,Debug()的級別低于日志對象logger的日志級別(INFO),因此,日志請求被拒絕了,我們得不到任何輸出。同樣的,針對第三行語句,我們可以很容易得出結論。
在表1中有兩個特殊的級別:ALL和OFF。ALL表示允許所有的日志請求。OFF是拒絕所有的請求。
你也可以顯式地檢查Logger對象的Boolean屬性,如下所示:
if (logger.IsDebugEnabled)
{
Logger.Debug("message");
}
Repository主要用于負責日志對象組織結構的維護。在log4net的以前版本中,框架僅支持分等級的組織結構(hierarchical organization)。這種等級結構本質上是庫的一個實現,并且定義在log4net.Repository.Hierarchy 名字空間中。要實現一個Repository,需要實現log4net.Repository.ILoggerRepository 接口。但是通常并不是直接實現該接口,而是以log4net.Repository.LoggerRepositorySkeleton為基類繼承。體系庫 (hierarchical repository )則由log4net.Repository.Hierarchy.Hierarchy類實現。
如果你是個log4net框架的使用者,而非擴展者,那么你幾乎不會在你的代碼里用到Repository的類。相反的,你需要用到LogManager類來自動管理庫和日志對
一個好的日志框架應該能夠產生多目的地的輸出。比如說輸出到控制臺或保存到一個日志文件。log4net 能夠很好的滿足這些要求。它使用一個叫做Appender的組件來定義輸出介質。正如名字所示,這些組件把它們附加到Logger日志組件上并將輸出傳遞到輸出流中。你可以把多個Appender組件附加到一個日志對象上。 Log4net框架提供了幾個Appender組件。關于log4net提供的Appender組件的完整列表可以在log4net框架的幫助手冊中找到。有了這些現成的Appender組件,一般來說你沒有必要再自己編寫了。但是如果你愿意,可以從log4net.Appender.AppenderSkeleton類繼承。
先在web.config中的<configuration>節點下添加如下配置:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
還應該配置log4net節點,接下來在<configuration>節點下添加如下log4net節點配置:
<log4net>
<root>
<level value=" DEBUG" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="testApp.Logging">
<level value="DEBUG"/>
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="c://log-file.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] - %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
</log4net>
從上面的配置中可以看到定義了多個appender,每一個appender就是一個日志記錄的目標。root節點指定了選用哪一個 appender. 在這里我選用了LogFileAppender。到這里配置就基本上完成了,但是怎么使用上面的配置呢?log4net為我們提供了在應用程序啟動時加載配置信息的入口,很簡單,在Global.asax.cs的application_Start過程中添加如下代碼:
log4net.Config.DOMConfigurator.Configure();
好了,到此為止整個配置過程完成了,下面是怎么調用的問題了
1、 關聯配置文件
當我們創建了上面的配置文件后,我們接下來需要把它和我們的應用聯系起來。缺省的,每個獨立的可執行程序集都會定義它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的級別上定義配置文件。
例如:可以在項目的AssemblyInfo.cs文件里添加以下的語句
[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",
ConfigFileExtension="ext",Watch=true/false)]
ConfigFile:指出了我們的配置文件的路徑及文件名,包括擴展名。
ConfigFileExtension:如果我們對被編譯程序的程序集使用了不同的文件擴展名,那么我們需要定義這個屬性,缺省的,程序集的配置文件擴展名為”config”。
Watch (Boolean屬性): log4net框架用這個屬性來確定是否需要在運行時監視文件的改變。如果這個屬性為true,那么FileSystemWatcher將會被用來監視文件的改變,重命名,刪除等事件。
其中:ConfigFile和ConfigFileExtension屬性不能同時使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”
ConfigFileExtension則是指明了和可執行程序集同名的配置文件的擴展名,例如,應用程序的名稱是”test.exe”,ConfigFileExtension=”txt”,則配置文件就應該是”test.exe.txt” ;
也可以不帶參數應用DOMConfiguratio():
[assembly: log4net.Config.DOMConfigurator()]
也可以在程序代碼中用DOMConfigurator類打開配置文件。類的構造函數需要一個FileInfo對象作參數,以指出要打開的配置文件名。 這個方法和前面在程序集里設置屬性打開一個配置文件的效果是一樣的。
log4net.Config.DOMConfigurator.Configure( new FileInfo("TestLogger.Exe.Config"));
DOMConfigurator 類還有一個方法ConfigureAndWatch(..), 用來配置框架并檢測文件的變化。
以上的步驟總結了和配置相關的各個方面,下面我們將分兩步來使用logger對象。
2 、創建或獲取日志對象
日志對象會使用在配置文件里定義的屬性。如果某個日志對象沒有事先在配置文件里定義,那么框架會根據繼承結構獲取祖先節點的屬性,最終的,會從根日志獲取屬性。如下所示: Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");
3、 輸出日志信息
可以使用ILog的幾種方法輸出日志信息。你也可以在調用某方法前先檢查IsXXXEnabled布爾變量,再決定是否調用輸出日志信息的函數,這樣可以提高程序的性能。因為框架在調用如ILog.Debug(…)這樣的函數時,也會先判斷是否滿足Level日志級別條件。
if (log.IsDebugEnabled) log.Debug("message");
if (log.IsInfoEnabled) log.Info("message);
4、 在程序中配置log4net
除了前面講的用一個配置文件來配置log4net以外,還可以在程序中用代碼來配置log4net框架。如下面的例子:
// 和PatternLayout一起使用FileAppender
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.FileAppender(
new log4net.Layout.PatternLayout("%d
[%t]%-5p %c [%x] - %m%n"),"testfile.log"));
// using a FileAppender with an xmlLayout
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.FileAppender(
new log4net.Layout.XMLLayout(),"testfile.xml"));
// using a ConsoleAppender with a PatternLayout
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.ConsoleAppender(
new log4net.Layout.PatternLayout("%d
[%t] %-5p %c - %m%n")));
// using a ConsoleAppender with a SimpleLayout
log4net.Config.BasicConfigurator.Configure(
new log4net.Appender.ConsoleAppender(new
log4net.Layout.SimpleLayout()));
盡管這里用代碼配置log4net也很方便,但是你卻不能分別配置每個日志對象。所有的這些配置都是被應用到根日志上的。
log4net.Config.BasicConfigurator 類使用靜態方法Configure 設置一個Appender 對象。而Appender的構造函數又會相應的要求Layout對象。你也可以不帶參數直接調用BasicConfigurator.Configure(),它會使用一個缺省的PatternLayout對象,在一個ConsoleAppender中輸出信息。如下所示:
log4net.Config.BasicConfigurator.Configure();
在輸出時會顯示如下格式的信息:
0 [1688] DEBUG log1 A B C - Test
20 [1688] INFO log1 A B C - Test
當log4net框架被配置好以后,就可以如前所述使用日志功能了。
新建一個log4nettest.aspx頁面,在cs文件中添加引用 using log4net;定義本頁的一個全局變量:PRivate static readonly ILog log = LogManager.GetLogger(typeof(log4nettest));
然后在Page_Load中添加如下代碼:log.Debug("這是我在使用Log4Net");運行該頁面,在C:/下面會生成一個c://log-file.tx文本文件,打開看看,里面就有你寫入的日志。
在Global.asax添加如下的內容:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
log4net.Config.DOMConfigurator.Configure();
}
實例
簡單的使用步驟:
1。下載log4net.dll,并在項目中引用。
2。配置log4net.xml,想要根據具體要求修改的話,請參照文獻查找各個參數的含義。
<?xml version="1.0" encoding="utf-8" ?><configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> </configSections> <log4net> <!-- Define some output appenders --> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <param name="File" value="log-file.txt" /> <!-- Example using environment variables in params --> <!-- <param name="File" value="${TMP}//log-file.txt" /> --> <param name="AppendToFile" value="true" /> <!-- An alternate output encoding can be specified --> <!-- <param name="Encoding" value="unicodeFFFE" /> --> <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] - %m%n" /> </layout> <!-- Alternate layout using XML <layout type="log4net.Layout.XMLLayout" /> --> </appender> <!-- Setup the root category, add the appenders and set the default level --> <root> <level value="ALL" /> <appender-ref ref="LogFileAppender" /> <!-- <appender-ref ref="A" /> --> </root> <!-- Specify the level for some specific categories --> <logger name="SLog4net.Form1"> <!-- <appender-ref ref="B" /> --> <level value="ALL" /> <appender-ref ref="LogFileAppender" /> </logger> </log4net> </configuration>
記得:如果是web程序要將log4net.xml放到根目錄下面,如果是winform要將log4net.xml放到啟動目錄下面。
3.在項目的AssemblyInfo .cs中添加
[assembly: log4net.Config.DOMConfigurator(ConfigFile = "log4net.xml", Watch = true)]
4.在類中調用。
新建一個Form1的Windows窗體,在cs文件中添加引用 using log4net;定義本頁的一個全局變量:private static readonly ILog log = LogManager.GetLogger(typeof(Form1));
然后在Page_Load中添加如下代碼:log.Debug("這是我在使用Log4Net");運行該頁面,在項目下面會生成一個log-file.txt文本文件,打開看看,里面就有你寫入的日志。
新聞熱點
疑難解答