Log4net的使用

Log4net是一款非常好用、強大的開源日誌記錄組件,它來自於著名的Apache。起初是log4j專用於Java,後來又提供了log4net用於支持.NET。幫助.NET程序員也能夠輕鬆的處理日誌信息。

log4net是一個“庫”,用於幫助程序員輸出日誌到大量不同的輸出目標(文件、控制檯、不同的數據庫、甚至內存等等)。可以在這裏下載到它的最新版本。log4net

好,下面進入正題,在C#當中如何利用好這個“著名”的日誌組件呢?

我們可以按照下面的步驟來創建一個控制檯項目來利用log4net進行日誌的記錄:

1、創建一個控制檯項目,並添加log4net.dll引用

log4net.dll,這個文件可以從下載的包中找到。在創建好的控制檯項目中,直接添加引用這個文件就可以了。

2、創建一個log4net.config文件,用於單獨的進行log4net日誌信息的配置

配置文件是核心,它記錄了日誌的詳細的配置情況。log4net繼承了Java的優點,能夠以靈活的配置方式,將日誌信息輸出到不同的數據源。

下面展示了一個完整的log4net.config文件: 

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <!--添加log4net自定義節點-->  
  4.   <configSections>  
  5.     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>  
  6.   </configSections>  
  7.   <log4net>  
  8.   
  9.     <!--文件形式-->  
  10.     <appender name="FileAppender" type="log4net.Appender.FileAppender">  
  11.       <!--文件路徑-->  
  12.       <file value="log-file.txt"/>  
  13.       <!--是否追加-->  
  14.       <appendToFile value="true"/>  
  15.       <!--顯示格式-->  
  16.       <layout type="log4net.Layout.PatternLayout">  
  17.         <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>  
  18.       </layout>  
  19.     </appender>  
  20.   
  21.     <!--SqlServer形式-->  
  22.     <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">  
  23.       <bufferSize value="100" />  
  24.       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
  25.       <connectionString value="data source=10.77.137.119;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=123456" />  
  26.       <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />  
  27.       <parameter>  
  28.         <parameterName value="@log_date" />  
  29.         <dbType value="DateTime" />  
  30.         <layout type="log4net.Layout.RawTimeStampLayout" />  
  31.       </parameter>  
  32.       <parameter>  
  33.         <parameterName value="@thread" />  
  34.         <dbType value="String" />  
  35.         <size value="255" />  
  36.         <layout type="log4net.Layout.PatternLayout">  
  37.           <conversionPattern value="%thread" />  
  38.         </layout>  
  39.       </parameter>  
  40.       <parameter>  
  41.         <parameterName value="@log_level" />  
  42.         <dbType value="String" />  
  43.         <size value="50" />  
  44.         <layout type="log4net.Layout.PatternLayout">  
  45.           <conversionPattern value="%level" />  
  46.         </layout>  
  47.       </parameter>  
  48.       <parameter>  
  49.         <parameterName value="@logger" />  
  50.         <dbType value="String" />  
  51.         <size value="255" />  
  52.         <layout type="log4net.Layout.PatternLayout">  
  53.           <conversionPattern value="%logger" />  
  54.         </layout>  
  55.       </parameter>  
  56.       <parameter>  
  57.         <parameterName value="@message" />  
  58.         <dbType value="String" />  
  59.         <size value="4000" />  
  60.         <layout type="log4net.Layout.PatternLayout">  
  61.           <conversionPattern value="%message" />  
  62.         </layout>  
  63.       </parameter>  
  64.       <parameter>  
  65.         <parameterName value="@exception" />  
  66.         <dbType value="String" />  
  67.         <size value="2000" />  
  68.         <layout type="log4net.Layout.ExceptionLayout" />  
  69.       </parameter>  
  70.     </appender>  
  71.   
  72.     <!--Access數據庫-->  
  73.     <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">  
  74.       <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Administrator\桌面\test.mdb;User Id=;Password=;" />  
  75.       <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />  
  76.       <parameter>  
  77.         <parameterName value="@log_date" />  
  78.         <dbType value="String" />  
  79.         <size value="255" />  
  80.         <layout type="log4net.Layout.PatternLayout">  
  81.           <conversionPattern value="%date" />  
  82.         </layout>  
  83.       </parameter>  
  84.       <parameter>  
  85.         <parameterName value="@thread" />  
  86.         <dbType value="String" />  
  87.         <size value="255" />  
  88.         <layout type="log4net.Layout.PatternLayout">  
  89.           <conversionPattern value="%thread" />  
  90.         </layout>  
  91.       </parameter>  
  92.       <parameter>  
  93.         <parameterName value="@log_level" />  
  94.         <dbType value="String" />  
  95.         <size value="50" />  
  96.         <layout type="log4net.Layout.PatternLayout">  
  97.           <conversionPattern value="%level" />  
  98.         </layout>  
  99.       </parameter>  
  100.       <parameter>  
  101.         <parameterName value="@logger" />  
  102.         <dbType value="String" />  
  103.         <size value="255" />  
  104.         <layout type="log4net.Layout.PatternLayout">  
  105.           <conversionPattern value="%logger" />  
  106.         </layout>  
  107.       </parameter>  
  108.       <parameter>  
  109.         <parameterName value="@message" />  
  110.         <dbType value="String" />  
  111.         <size value="1024" />  
  112.         <layout type="log4net.Layout.PatternLayout">  
  113.           <conversionPattern value="%message" />  
  114.         </layout>  
  115.       </parameter>  
  116.     </appender>  
  117.   
  118.     <!--Oracle形式-->  
  119.     <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">  
  120.       <!--數據庫連接類型-->  
  121.       <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
  122.       <!--數據庫連接字符串-->  
  123.       <connectionString value="data source=orcl;User ID=damis;Password=damis" />  
  124.       <!--數據庫執行語句-->  
  125.       <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" />  
  126.       <!--緩衝區大小-->  
  127.       <bufferSize value="128" />  
  128.       <!--數據庫表字段參數-->  
  129.       <parameter>  
  130.         <parameterName value=":log_date" />  
  131.         <dbType value="DateTime" />  
  132.         <layout type="log4net.Layout.RawTimeStampLayout" />  
  133.       </parameter>  
  134.       <parameter>  
  135.         <parameterName value=":thread" />  
  136.         <dbType value="String" />  
  137.         <size value="255" />  
  138.         <layout type="log4net.Layout.PatternLayout">  
  139.           <conversionPattern value="%thread" />  
  140.         </layout>  
  141.       </parameter>  
  142.       <parameter>  
  143.         <parameterName value=":log_level" />  
  144.         <dbType value="String" />  
  145.         <size value="50" />  
  146.         <layout type="log4net.Layout.PatternLayout">  
  147.           <conversionPattern value="%level" />  
  148.         </layout>  
  149.       </parameter>  
  150.       <parameter>  
  151.         <parameterName value=":logger" />  
  152.         <dbType value="String" />  
  153.         <size value="255" />  
  154.         <layout type="log4net.Layout.PatternLayout">  
  155.           <conversionPattern value="%logger" />  
  156.         </layout>  
  157.       </parameter>  
  158.       <parameter>  
  159.         <parameterName value=":message" />  
  160.         <dbType value="String" />  
  161.         <size value="4000" />  
  162.         <layout type="log4net.Layout.PatternLayout">  
  163.           <conversionPattern value="%message" />  
  164.         </layout>  
  165.       </parameter>  
  166.     </appender>  
  167.   
  168.     <!--配置日誌的目標存儲形式-->  
  169.     <root>  
  170.       <!--文件形式-->  
  171.       <appender-ref ref="FileAppender"/>  
  172.   
  173.       <!--SqlServer形式-->  
  174.       <appender-ref ref="AdoNetAppender_SqlServer"/>  
  175.   
  176.       <!--Oracle形式-->  
  177.       <appender-ref ref="AdoNetAppender_Oracle"/>  
  178.   
  179.       <!--Access形式-->  
  180.       <appender-ref ref="AdoNetAppender_Access"/>  
  181.     </root>  
  182.   </log4net>  
  183. </configuration>  
上面我直接引用了官方的配置示例。可以在這裏找到:log4net配置示例。這裏面有各種目標數據源的配置示例,非常全面。

3、建立一個類Logger,用於進行日誌的記錄

在建好的Logger類中,添加如下代碼:

[csharp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //如果是winform或console等c/s程序,需要設置一下。  
  2. //具體步驟:右鍵log4net.config文件-屬性-複製到輸出目錄:始終複製。目的是爲了每次啓動時能夠找到這個config文件  
  3. [assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4net.config")]  
  4. namespace Log4net  
  5. {  
  6.     /// <summary>  
  7.     /// 日誌記錄類  
  8.     /// </summary>  
  9.     public class Logger  
  10.     {  
  11.         #region 記錄日誌  
  12.         /// <summary>  
  13.         /// 記錄日誌  
  14.         /// </summary>  
  15.         /// <param name="legLevel">日誌級別</param>  
  16.         /// <param name="msg">日誌內容</param>  
  17.         public static void LoggerMsg(LogLevel legLevel, string msg)  
  18.         {  
  19.             log4net.ILog log = GetLogger();  
  20.             switch (legLevel)  
  21.             {  
  22.                 case LogLevel.Debug: log.Debug(msg); break;//Debug  
  23.                 case LogLevel.Error: log.Error(msg); break;//Error  
  24.                 case LogLevel.Fatal: log.Fatal(msg); break;//Fatal  
  25.                 case LogLevel.Info: log.Info(msg); break;//Info  
  26.                 case LogLevel.Warn: log.Warn(msg); break;//Warn  
  27.                 defaultbreak;  
  28.             }  
  29.         }  
  30.         #endregion  
  31.  
  32.         #region 獲得一個日誌記錄對象  
  33.         /// <summary>  
  34.         /// 獲得一個日誌記錄對象  
  35.         /// </summary>  
  36.         /// <returns>日誌記錄對象</returns>  
  37.         public static log4net.ILog GetLogger()  
  38.         {  
  39.             //MethodBase.GetCurrentMethod().DeclaringType 返回:命名空間名+類名  
  40.             return log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);  
  41.         }  
  42.         #endregion  
  43.     }  
  44.   
  45.     /// <summary>  
  46.     /// 日誌記錄級別  
  47.     /// </summary>  
  48.     public enum LogLevel  
  49.     {  
  50.         Debug,  
  51.         Info,  
  52.         Warn,  
  53.         Error,  
  54.         Fatal,  
  55.     }  
  56. }  
這裏強調的是,一定要在命名空間上面加上:[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4net.config")]。並且如果你的是c/s項目,比如控制檯、winform等程序,則必須要右鍵log4net.config文件-屬性-複製到輸出目錄:改爲始終複製。這樣程序加載時才能找到這個log4net.config,才能進行日誌的記錄。

4、在控制檯Main方法中進行測試

好了,最後一步,就是對上述的配置進行測試了。我們在Main方法中加上如下測試代碼。

[csharp] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //主方法測試用  
  2. Logger.LoggerMsg(LogLevel.Info, "hello,log4net!");  
運行這個控制檯,程序正常執行。

上面我演示了將日誌記錄輸出到文件、Sql Server數據庫、Oracle數據庫、Access數據庫等四種情況。如果有更多的其它數據源的輸出,可以參考官方網站:http://logging.apache.org/log4net/release/config-examples.html 。


最後看下執行的結果:

txt:


access 2007:


sqlserver 2008:


oracle 10g:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章