.Net魔法堂:log4net詳解


一、作用                            

 提供一個記錄日志的框架,可以將日志信息記錄到文件、控制台、Windows事件日志和數據庫(MSSQL、Acess、Oracle、DB2和SQLite等)。

 

二、先看看示例,感受一下吧                    

config配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
  <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<log4net>
  <!-- 定義日志的輸出媒介 -->
  <root>
    <appender-ref ref="ConsoleAppender"/>
    <appender-ref ref="R"/>
  </root>
  <!-- 定義輸出到控制台 -->
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
    </layout> 
  </appender>
  <!-- 定義輸出到日志文件 -->
  <appender name="R" type="log4net.Appender.FileAppender" rollingStyle="Date" datePattern="yyyyMMdd-HH:mm:ss">
    <file value="logs/log.txt"></file>
    <appendToFile value="true"></appendToFile>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%-d{yyyy-MM-dd HH\:mm\:ss}  [%L] [%c]-[%p] %m%n"></conversionPattern> 
    </layout>
  </appender>
</log4net>
</configuration>

cs文件

/**
 * 指定log4net使用.config文件來讀取配置信息
 * 若為Winform(假定程序為Demo.exe), 那么配置文件則為Demo.exe.config
 * 若為Webform,則為web.config
 */
[assembly:log4net.Config.XmlConfigurator(Watch=true)]
namespace Demo{
  public class MainClass{
    public static void Main(String[] args){
    ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        log.Error("error", new Exception("there is an exception"));
        log.Fatal("fatal", new Exception("there is a deadly exception occurs"));
    log.Info("info");
    log.Debug("debug");
    log.Warn("warn");
    Console.Read();
    }
  }
}

 

三、框架的核心組件                         

 1. Appender

  作用:用於定義日志信息的輸出介質(文件、控制台、Windows事件日志和數據庫(MSSQL、Acess、Oracle、DB2和SQLite等))
  內置的Appdner組件:

     ConsoleAppender ,輸出介質為控制台

       FileAppender     ,輸出介質為文件,示例如下

<appender name="FileAppender" type="log4net.Appender.FileAppender"
 file="logs/log.txt" appendToFile="true">
  <layout type="log4net.Layout.PatternLayout">
    ..........
  </layout>
</appender>

            RollingFileAppender ,將日志以回滾文件的形式寫入文件中。可以指定文件最大容量,當超過就生成一個新文件來記錄,且可以指定最多生成日志文件數量,當超過時則覆蓋從第一個日志文件開始循環覆蓋。

示例1:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" 
 file="logs/log.txt" appendToFile="true" rollingStyle="Size" maxSizeRollBackups="10" maximumFileSize="100KB" staticLogFileName="true">
  <layout type="log4net.Layout.PatternLayout">
    ..........
  </layout>
</appender>

示例2:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" 
file="logs/log.txt" appendToFile="true" rollingStyle="Date" datePattern="yyyyMMdd">
  <layout type="log4net.Layout.PatternLayout">
    ..........
  </layout>
</appender>

           EventLogAppender ,輸出介質為系統日志

           AdoNetAppender    ,輸出介質為數據庫,示例如下

<appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender"> 
      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient" /> 
      <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" /> 
      <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" /> 
      <bufferSize value="128" /> 
      <parameter> 
        <parameterName value=":log_date" /> 
        <dbType value="DateTime" /> 
        <layout type="log4net.Layout.RawTimeStampLayout" /> 
      </parameter> 
      <parameter> 
        <parameterName value=":thread" /> 
        <dbType value="String" /> 
        <size value="255" /> 
        <layout type="log4net.Layout.PatternLayout"> 
          <conversionPattern value="%thread" /> 
        </layout> 
      </parameter> 
      <parameter> 
        <parameterName value=":log_level" /> 
        <dbType value="String" /> 
        <size value="50" /> 
        <layout type="log4net.Layout.PatternLayout"> 
          <conversionPattern value="%level" /> 
        </layout> 
      </parameter> 
      <parameter> 
        <parameterName value=":logger" /> 
        <dbType value="String" /> 
        <size value="255" /> 
        <layout type="log4net.Layout.PatternLayout"> 
          <conversionPattern value="%logger" /> 
        </layout> 
      </parameter> 
      <parameter> 
        <parameterName value=":message" /> 
        <dbType value="String" /> 
        <size value="4000" /> 
        <layout type="log4net.Layout.PatternLayout"> 
          <conversionPattern value="%message" /> 
        </layout> 
      </parameter> 
    </appender> 
View Code

            自定義Appender時,需要繼承 log4net.Appender.AppenderSkeleton 

 2. Layout

     作用:定義向用戶顯示最終的經格式化的輸出信息。
     注意:一個Appender對象僅能對應一個Layout對象
     內容的Layout組件:

     PatternLayout ,用戶自定義格式,內置參數如下

%m(message),輸出的日志消息
%n(newline),換行
%d(datetime),輸出當前語句運行的時刻
%r(runtime),輸出程序從運行到當前語句時消耗的毫秒數
%t(thread id),輸出當前語句運行的線程ID
%p(level),輸出日志級別(日志事件)
%c(class),輸出當前語句所在的對象名稱
%M(method),輸出當前語句所在的方法名稱
%f(file),輸出當前語句所在的文件名稱
%L(line),輸出當前語句位於所在的文件中的行號
%l(location),輸出當前語句位於的全限定類名,以及源文件和行號
%數字,表示該項的最小長度,如果不夠則在左邊用空格填充。如:%5p,表示輸出日志級別,且長度最小為5個字符
%-數字,表示該項的最小長度,如果不夠則在右邊用空格填充。如:%-5p,表示輸出日志級別,且長度最小為5個字符
%.數字,表示該項的最大長度,如果超出則截斷
%數字.數字,表示該項的必須位於最小和最大長度之間,如果超出則截斷, 不夠則用空格填充

              最佳實踐: %-d{yyyy-MM-dd HH\:mm\:ss} [%L] [%c]-[%p] %m%n 

              SimpleLayout 

              ExceptionLayout ,輸出時包含Message和Trace信息。Logger方法必須傳入Exception對象,否則什么都不輸出。
XmlLayout,中文會有問題。

              自定義Layout時,需要繼承 log4net.Layout.LayoutSkeleton 

  3. Appender Filter

  作用:默認情況下Appender對象會將所有日志信息都輸出到相應的介質中,通過Appender Filter對象(命令空間:log4net.Filter)可以按照不同的標准過濾日志事件或內容。
  內置的Filter組件:

     DenyAllFilter ,阻止所有的日志事件被記錄

         LevelMatchFilter ,只有指定等級的日志事件才被記錄

         LevelRangeFilter ,日志等級在指定范圍內的事件才被記錄

         LoggerMatchFilter , Logger名稱匹配才被記錄

         PropertyFilter ,消息匹配指定的屬性值才被記錄

         StringMatchFilter ,消息匹配指定的字符串才被記錄

  4. Logger

    作用:直接與應用交互的組件,用於觸發日志事件

級別(日志事件) 優先級
OFF 6
FATAL 5
ERROR 4
WARN 3
INFO 2
DEBUG 1
ALL  0

 

  5. Object Render

   作用:輸出根據Layout格式化的日志消息。Render必須實現log4net.ObjectRender.IObjectRender接口 

 

  6. Repository

   作用:負責日志對象組織結構的維護。對於非框架擴展者,幾乎不會用到該組件。

 

四、配置方式                           

  1. 代碼中配置
    通過 log4net.Config.BasicConfigurator.Configure 配置根日志且只能配置根日志而已。
    示例 :

// 和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()));

 

  2. 配置文件(推薦使用)

    log4net框架會在 AppDomain.CurrentDomain.BaseDirectory 指向的目錄路徑下查找配置文件。

    在config文件中配置
            在<configuration>節點下添加<configSections>節點

<configSections>
  <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>

            只有添加上述節點,log4net.dll才能讀取config文件下<log4net>節點下配置信息

     根日志<root>節點
            框架中所有日志對象都是根日志的后代,因此日志對象若沒有顯式配置時則會使用根日志的配置信息。

<root>
  <!-- level節點用於定義處理哪個級別的日志事件,缺省值為DEBUG -->
  <level>INFO</level>
  <!-- appender-ref節點用於定義日志對象所使用的Appender對象 -->
  <appender-ref ref="appender節點的name屬性值"/>
</root>

    日志對象<logger>節點

      顯式配置日志對象。

<!-- additivity特性設置為false時,日志對象將不繼承根日志的appender-ref節點信息。缺省值為true -->
<logger name="test.Logging" additivity="false">
  <!-- 覆蓋根日志的level設置 -->
  <level value="WARN"/>
</logger>

           .cs文件中的相應的調用方式

log4net.LogManager.GetLogger("test.Logging");

   Appender對象<appender>節點

<appender name="appender1" type="log4net.Appender.FileAppender">
  <layout type="log4net.Laytout.PatternLayout">
    <conversionPattern value=".........."/>
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter" levelMin="DEBUG" levelMax="WARN">
  </filter>
</appender>

 

五、關聯配置文件                           

   每個可獨立執行的程序集均可以關聯自己的配置文件。(組件庫就使用調用者的配置文件好了)
   在 AssemblyInfo.cs文件 中添加

[assembly:log4net.Config.DOMConfigurator([ConfigFile="配置文件名"|ConfigFileExtension="編譯后配置文件的擴展名"][Watch=true/false])

參數說明:

 ConfigFile :指定配置文件含擴展名的路徑,如果為相對路徑則以AppDomain.CurrentDomain.BaseDirectory為當前路徑;
 ConfigFileExtension :若程序編譯后配置文件使用了不同的擴展名,則通過該屬性指定,默認值為config,配置文件的最終名稱為"應用程序名.exe.config";
                                          注意:ConfigFile和ConfigFileExtension屬性是互斥的,僅能設置其中一個
 Watch :設置是否需要運行時監視文件的修改、重命名和刪除等事件,若設置為true,則使用FileSystemWatcher來監視配置文件。

 

六、輸出日志的優化方式                          

/**
 * 由於觸發日志事件時,會檢查日志對象的級別是否滿足日志事件的級別
 * 先檢測日志對象的級別,才觸發日志事件 
 */
if (log.IsDebugEnabled) log.Debug("message.....");

 

七、總結                                

    現在我們就不再糊里糊塗地調用log4net了,建議具體使用時再查閱API文檔!

    尊重原創,轉載請注明來自: http://www.cnblogs.com/fsjohnhuang/p/3991218.html  ^_^肥仔John

 

八、參考                                

http://www.cnblogs.com/jams742003/archive/2009/12/10/1620861.html
http://zhoufoxcn.blog.51cto.com/792419/429988


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM