C#關於log4net(Log For Net)

1       介紹

log4net(Log For Net)是Apache開源的應用於.Net框架的日誌記錄工具,詳細信息參見Apache網站.它是針對Java的log4j(Log For Java的)姊妹工具.用過log4j的都知道,它功能強大,可配置性靈活,線程安全,對日誌的輸出管理和級別管理方便。具體的使用方法往下看。html

首先你應該下載log4net.dll並引入到你的項目References中,或者把源代碼項目做爲你工程的一部分加入到你的工程當中。單擊這裏下載Log4net 。web

使用log4net須要知道其中兩個比較重要的概念:logger 和 appender。前者是日誌記錄對象,後者是日誌記錄的目標,包括控制檯,文件,定量大小的文件,遠程廣播。也就是說咱們使用log4net的過程能夠是這樣的:得到一個用來記錄日誌的工具對象logger,而後爲logger對象指定日誌的記錄位置.美妙的是,這一切工做均可以在Web.config配置文件中完成,所用的代碼極少。安全

1.1 優勢

幾乎全部的大型應用都會有本身的用於跟蹤調試的API。由於一旦程序被部署之後,就不太可能再利用專門的調試工具了。然而一個管理員可能須要有一套強大的日誌系統來診斷和修復配置上的問題。app

經驗代表,日誌記錄每每是軟件開發週期中的重要組成部分。它具備如下幾個優勢:它能夠提供應用程序運行時的精確環境,可供開發人員儘快找到應用程序中的Bug;一旦在程序中加入了Log 輸出代碼,程序運行過程當中就能生成並輸出日誌信息而無需人工干預。另外,日誌信息能夠輸出到不一樣的地方(控制檯,文件等)以備之後研究之用。框架

Log4net就是爲這樣一個目的設計的,用於.NET開發環境的日誌記錄包。函數

1.2安裝

用戶要在本身的程序里加入日誌功能,只需將log4net.dll引入工程便可。工具

1.3結構

log4net 有四種主要的組件,分別是Logger(記錄器), Repository(庫), Appender(附着器)以及 Layout(佈局)。佈局

1.4Logger接口

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");

}

1.5Repository接口

Repository主要用於負責日誌對象組織結構的維護。在log4net的之前版本中,框架僅支持分等級的組織結構(hierarchical organization)。這種等級結構本質上是庫的一個實現,而且定義在log4net.Repository.Hierarchy 名字空間中。要實現一個Repository,須要實現log4net.Repository.ILoggerRepository 接口。可是一般並非直接實現該接口,而是以log4net.Repository.LoggerRepositorySkeleton爲基類繼承。體系庫 (hierarchical repository )則由log4net.Repository.Hierarchy.Hierarchy類實現。

若是你是個log4net框架的使用者,而非擴展者,那麼你幾乎不會在你的代碼裏用到Repository的類。相反的,你須要用到LogManager類來自動管理庫和日誌對

1.6Appender

一個好的日誌框架應該可以產生多目的地的輸出。好比說輸出到控制檯或保存到一個日誌文件。log4net 可以很好的知足這些要求。它使用一個叫作Appender的組件來定義輸出介質。正如名字所示,這些組件把它們附加到Logger日誌組件上並將輸出傳遞到輸出流中。你能夠把多個Appender組件附加到一個日誌對象上。 Log4net框架提供了幾個Appender組件。關於log4net提供的Appender組件的完整列表能夠在log4net框架的幫助手冊中找到。有了這些現成的Appender組件,通常來講你沒有必要再本身編寫了。可是若是你願意,能夠從log4net.Appender.AppenderSkeleton類繼承。

2       配置說明

先在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();

好了,到此爲止整個配置過程完成了,下面是怎麼調用的問題了

一、 關聯配置文件

當咱們建立了上面的配置文件後,咱們接下來須要把它和咱們的應用聯繫起來。缺省的,每一個獨立的可執行程序集都會定義它本身的配置。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");

三、  輸出日誌信息

 

可使用ILog的幾種方法輸出日誌信息。你也能夠在調用某方法前先檢查IsXXXEnabled布爾變量,再決定是否調用輸出日誌信息的函數,這樣能夠提升程序的性能。由於框架在調用如ILog.Debug(…)這樣的函數時,也會先判斷是否知足Level日誌級別條件。

if (log.IsDebugEnabled) log.Debug("message");

if (log.IsInfoEnabled) log.Info("message);

四、  在程序中配置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框架被配置好之後,就能夠如前所述使用日誌功能了。

3       調用

新建一個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,想要根據具體要求修改的話,請參照文獻查找各個參數的含義。

 

[html] view plain copy print ?
 
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.  <configSections>  
  4.   <section   name="log4net"   type="System.Configuration.IgnoreSectionHandler"   />  
  5.  </configSections>  
  6.  <log4net>  
  7.     <!--   Define   some   output   appenders   -->  
  8.     <appender   name="LogFileAppender"   type="log4net.Appender.FileAppender">  
  9.       <param   name="File"   value="log-file.txt"   />  
  10.       <!--   Example   using   environment   variables   in   params   -->  
  11.       <!--   <param   name="File"   value="${TMP}//log-file.txt"   />   -->  
  12.       <param   name="AppendToFile"   value="true"   />  
  13.       <!--   An   alternate   output   encoding   can   be   specified   -->  
  14.       <!--   <param   name="Encoding"   value="unicodeFFFE"   />   -->  
  15.       <layout   type="log4net.Layout.PatternLayout">  
  16.         <param   name="Header"   value="[Header]/r/n"   />  
  17.         <param   name="Footer"   value="[Footer]/r/n"   />  
  18.         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n"     />  
  19.       </layout>  
  20.       <!--   Alternate   layout   using   XML           
  21.         <layout   type="log4net.Layout.XMLLayout"   />   -->  
  22.     </appender>  
  23.     <!--   Setup   the   root   category,   add   the   appenders   and   set   the   default   level   -->  
  24.     <root>  
  25.       <level   value="ALL"   />  
  26.       <appender-ref   ref="LogFileAppender"   />  
  27.       <!--   <appender-ref   ref="A"   />   -->  
  28.     </root>  
  29.     <!--   Specify   the   level   for   some   specific   categories   -->  
  30.     <logger   name="SLog4net.Form1">  
  31.       <!--   <appender-ref   ref="B"   />   -->  
  32.       <level   value="ALL"   />  
  33.       <appender-ref   ref="LogFileAppender"   />  
  34.     </logger>  
  35.   </log4net>  
  36.  </configuration>  
<?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文本文件,打開看看,裏面就有你寫入的日誌。

相關文章
相關標籤/搜索