Log4Net使用詳解續

首先說明一點的是,log4net解決的問題是提供一個記錄日誌的框架,它提供了向多種目標寫入的實現,比如利用log4net可以方便地將日誌信息記錄到文件、控制檯、Windows事件日誌和數據庫(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中,一般來說我們只需要提供一個描述性的字符串,然後log4net就會自動提供有關運行時的一些信息。
Log4Net的版本仍是1.2.10(2008年我寫博文的時候也是這個版本),有.NET1.0和.NET1.1和.NET2.0版本,如果有正在使用高於.NET2.0開發的也不用擔心,可以直接引用這個類庫,像在.NET2.0中開發一樣,它的網址是:
http://logging.apache.org/log4net/
關於在Web中支持的問題
在我們開發項目時都會使用到config文件,可以在config文件中配置log4net。這一點Web項目和WinForm項目都是一樣的。需要注意的是,因爲在Web項目中一般以較低權限的角色來運行Web項目的,所以在使用文件型日誌時要注意不要放在本項目根文件夾之外。
在config文件中的配置

要使用log4net,首先要在config文件的<configSections>節點中增加配置(如果沒有這個節點請手動增加),如下:

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

除此之外,還要在頂級節點<configuration>下增加<log4net>子節點。在<log4net>節點下就可以增加<appender>子節點,每個<appender>子節點代表一種記錄日誌的方式(僅在這裏配置了不代表啓用了)。
具體說來有如下Appender:
AdoNetAppender:利用ADO.NET記錄到數據庫的日誌。
AnsiColorTerminalAppender:在ANSI 窗口終端寫下高亮度的日誌事件。
AspNetTraceAppender:能用asp.net中Trace的方式查看記錄的日誌。
BufferingForwardingAppender:在輸出到子Appenders之前先緩存日誌事件。
ConsoleAppender:將日誌輸出到控制檯。
EventLogAppender:將日誌寫到Windows Event Log.
FileAppender:將日誌寫到文件中。
LocalSyslogAppender:將日誌寫到local syslog service (僅用於UNIX環境下).
MemoryAppender:將日誌存到內存緩衝區。
NetSendAppender:將日誌輸出到Windows Messenger service.這些日誌信息將在用戶終端的對話框中顯示。
RemoteSyslogAppender:通過UDP網絡協議將日誌寫到Remote syslog service。
RemotingAppender:通過.NET Remoting將日誌寫到遠程接收端。
RollingFileAppender:將日誌以回滾文件的形式寫到文件中。
SmtpAppender:將日誌寫到郵件中。
TraceAppender:將日誌寫到.NET trace 系統。
UdpAppender:將日誌connectionless UDP datagrams的形式送到遠程宿主或以UdpClient的形式廣播。
關於使用log4net中可能會使用到的一些參數
%m(message):輸出的日誌消息,如ILog.Debug(…)輸出的一條消息
%n(new line):換行
%d(datetime):輸出當前語句運行的時刻
%r(run time):輸出程序從運行到執行到當前語句時消耗的毫秒數
%t(thread id):當前語句所在的線程ID
%p(priority): 日誌的當前優先級別,即DEBUG、INFO、WARN…等
%c(class):當前日誌對象的名稱,例如:
%f(file):輸出語句所在的文件名。
%l(line):輸出語句所在的行號。
%數字:表示該項的最小長度,如果不夠,則用空格填充,如“%-5level”表示level的最小寬度是5個字符,如果實際長度不夠5個字符則以空格填充。
下面以一個實際的例子來說明問題,比如在配置中有“%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline”,那麼實際的日誌中會是如下格式:
“記錄時間:2010-11-17 16:16:36,561 線程ID:[9] 日誌級別:文件:所在行ERROR 出錯類:Log4NetDemo.Program property:[(null)] - 錯誤描述:error
System.Exception: 在這裏發生了一個異常,Error Number:2036084948”
關於對數據庫的支持
前面已經說過,log4net是支持包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite在內的數據庫的,如果是文件型數據庫(如Access或SQLite)的話就需要指定數據庫文件的位置(在Web中最好指定在有讀寫權限的文件夾下,並且實現創建好表),如果是網絡數據庫就需要指定正確的數據庫連接字符串。
比如要記錄到Oracle數據庫中,在配置文件中可以增加一個< appender>節點,配置如下:

  1. <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender"> 
  2.       <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
  3.       <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" /> 
  4.       <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" /> 
  5.       <bufferSize value="128" /> 
  6.       <parameter> 
  7.         <parameterName value=":log_date" /> 
  8.         <dbType value="DateTime" /> 
  9.         <layout type="log4net.Layout.RawTimeStampLayout" /> 
  10.       </parameter> 
  11.       <parameter> 
  12.         <parameterName value=":thread" /> 
  13.         <dbType value="String" /> 
  14.         <size value="255" /> 
  15.         <layout type="log4net.Layout.PatternLayout"> 
  16.           <conversionPattern value="%thread" /> 
  17.         </layout> 
  18.       </parameter> 
  19.       <parameter> 
  20.         <parameterName value=":log_level" /> 
  21.         <dbType value="String" /> 
  22.         <size value="50" /> 
  23.         <layout type="log4net.Layout.PatternLayout"> 
  24.           <conversionPattern value="%level" /> 
  25.         </layout> 
  26.       </parameter> 
  27.       <parameter> 
  28.         <parameterName value=":logger" /> 
  29.         <dbType value="String" /> 
  30.         <size value="255" /> 
  31.         <layout type="log4net.Layout.PatternLayout"> 
  32.           <conversionPattern value="%logger" /> 
  33.         </layout> 
  34.       </parameter> 
  35.       <parameter> 
  36.         <parameterName value=":message" /> 
  37.         <dbType value="String" /> 
  38.         <size value="4000" /> 
  39.         <layout type="log4net.Layout.PatternLayout"> 
  40.           <conversionPattern value="%message" /> 
  41.         </layout> 
  42.       </parameter> 
  43.     </appender> 

當然從上面的配置中的SQL語句中可以看得出這個表的參數,日誌表的創建語句如下:

  1. create table log ( 
  2.    Datetime timestamp(3), 
  3.    Thread varchar2(255), 
  4.    Log_Level varchar2(255), 
  5.    Logger varchar2(255), 
  6.    Message varchar2(4000) 
  7.    ); 

在本例中周公採用了將日誌記錄到SQLite這個單機數據庫的方式,並且還將記錄記錄日誌時的文件名和行號,創建SQLite的SQL語句如下:

  1. CREATE TABLE Log ( 
  2.     LogId        INTEGER PRIMARY KEY, 
  3.     Date        DATETIME NOT NULL, 
  4.     Level        VARCHAR(50) NOT NULL, 
  5.     Logger        VARCHAR(255) NOT NULL, 
  6.     Source        VARCHAR(255) NOT NULL, 
  7.     Message        TEXT DEFAULT NULL 
  8.     ); 

增加的< appender>節點配置如下:

  1. <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender"
  2.   <bufferSize value="100" /> 
  3.   <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" /> 
  4.   <!--SQLite連接字符串--> 
  5.   <connectionString value="Data Source=c://log4net.db;Version=3;" /> 
  6.   <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" /> 
  7.   <parameter> 
  8.     <parameterName value="@Date" /> 
  9.     <dbType value="DateTime" /> 
  10.     <layout type="log4net.Layout.RawTimeStampLayout" /> 
  11.   </parameter> 
  12.   <parameter> 
  13.     <parameterName value="@Level" /> 
  14.     <dbType value="String" /> 
  15.     <layout type="log4net.Layout.PatternLayout"
  16.       <conversionPattern value="%level" /> 
  17.     </layout> 
  18.   </parameter> 
  19.   <parameter> 
  20.     <parameterName value="@Logger" /> 
  21.     <dbType value="String" /> 
  22.     <layout type="log4net.Layout.PatternLayout"
  23.       <conversionPattern value="%logger" /> 
  24.     </layout> 
  25.   </parameter> 
  26.   <parameter> 
  27.     <parameterName value="@Source" /> 
  28.     <dbType value="String" /> 
  29.     <layout type="log4net.Layout.PatternLayout"
  30.       <conversionPattern value="%file:%line" /> 
  31.     </layout> 
  32.   </parameter> 
  33.   <parameter> 
  34.     <parameterName value="@Message" /> 
  35.     <dbType value="String" /> 
  36.     <layout type="log4net.Layout.PatternLayout"
  37.       <conversionPattern value="%message" /> 
  38.     </layout> 
  39.   </parameter> 
  40. </appender> 

從上面的配置中可以看出插入數據的SQL語句及參數信息,下面的<parameter>節點就是指定插入的數據,比如我們指定SQL語句中的"@Source"參數來源於log4net中的"%file:%line"參數,也就是這兩個參數用“:”用連接起來。
控制日誌文件大小的問題
對於一個長時間使用並且有大量業務日誌的系統來說,如果使用FileAppender將日誌一直記錄到一個文件中會引起性能低下的問題,我曾見過有個系統的日誌文件達到了800多M,最後系統無法及時響應了,在這種情況下可考慮使用RollingFileAppender循環記錄日誌,一種是指定文件的最大長度,如果超過了就重新生成一個文件,如下面的配置:

  1. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
  2.   <file value="RollingFileAppender_log.txt" /> 
  3.   <appendToFile value="true" /> 
  4.   <rollingStyle value="Size" /> 
  5.   <maxSizeRollBackups value="10" /> 
  6.   <maximumFileSize value="100KB" /> 
  7.   <staticLogFileName value="true" /> 
  8.   <layout type="log4net.Layout.PatternLayout"> 
  9.     <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" /> 
  10.   </layout> 
  11. </appender> 

在上面的配置中,每個日誌文件最大100KB,最大日誌文件個數是10生成的日誌文件名會是RollingFileAppender_log.txt.1, RollingFileAppender_log.txt.2 ... RollingFileAppender_log.txt.10,如果記錄的日誌超過10個,會從RollingFileAppender_log.txt.1開始覆蓋。
還有一種方式就是按照日期記錄日誌,它的配置如下:

  1. <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender"> 
  2.   <file value="RollingLogFileAppender_DateFormat_log.txt" /> 
  3.   <appendToFile value="true" /> 
  4.   <rollingStyle value="Date" /> 
  5.   <!--<datePattern value="yyyyMMdd-HHmm" />--> 
  6.   <datePattern value="yyyyMMdd" /> 
  7.   <layout type="log4net.Layout.PatternLayout"> 
  8.     <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" /> 
  9.   </layout> 
  10. </appender> 

這樣一來,每天的日誌都寫入到一個文件中,當天的日誌文件名爲“RollingLogFileAppender_DateFormat_log.txt”,非當天的日誌都會帶上當天的日期,如“RollingLogFileAppender_DateFormat_log.txt20101117”表示2010年11月17日的日誌,這樣就可以很方便地區分每天的日誌了,將來查找起來也相當方便。
在配置中啓用和關閉日誌
在config文件中可以很方便地關閉和啓用日誌,就是在<root>進行配置,如下就是一個例子:

  1. <root> 
  2.   <!--文件形式記錄日誌--> 
  3.   <appender-ref ref="LogFileAppender" /> 
  4.   <!--控制檯控制顯示日誌--> 
  5.   <appender-ref ref="ConsoleAppender" /> 
  6.   <!--Windows事件日誌--> 
  7.   <!--<appender-ref ref="EventLogAppender" />--> 
  8.   <!--SQLite事件日誌--> 
  9.   <appender-ref ref="AdoNetAppender_SQLite" /> 
  10.   <!--RollingFileAppender事件日誌--> 
  11.   <appender-ref ref="RollingFileAppender" /> 
  12.   <!--RollingFileAppender事件日誌,每天一個日誌--> 
  13.   <appender-ref ref="RollingLogFileAppender_DateFormat" /> 
  14.   <!-- 如果不啓用相應的日誌記錄,可以通過這種方式註釋掉 
  15.   <appender-ref ref="AdoNetAppender_Access" /> 
  16.   --> 
  17. </root> 

在上面的例子中可以看出,如果想增加日誌輸出目的地,增加<appender-ref>節點就是了,注意後面的ref是在config中配置的appender name,如果想要取消,刪除或者註釋掉這行就可以了。
Log4Net的使用
首先要添加config文件,在類庫項目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。
下面是一個在WinForm項目中的使用Log4Net的例子:

  1. using System.Collections.Generic; 
  2. using System.Text; 
  3. using log4net; 
  4. using System.Reflection; 
  5.  
  6. //注意下面的語句一定要加上,指定log4net使用.config文件來讀取配置信息 
  7. //如果是WinForm(假定程序爲MyDemo.exe,則需要一個MyDemo.exe.config文件) 
  8. //如果是WebForm,則從web.config中讀取相關信息 
  9. [assembly: log4net.Config.XmlConfigurator(Watch = true)] 
  10. namespace Log4NetDemo 
  11.     class Program 
  12.     { 
  13.         static void Main(string[] args) 
  14.         { 
  15.             Random random = new Random(); 
  16.             for (int i = 0; i < 1; i++) 
  17.             { 
  18.                 //創建日誌記錄組件實例 
  19.                 //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
  20.  
  21.                 ILog log=log4net.LogManager.GetLogger(typeof(Program)); 
  22.                 //記錄錯誤日誌 
  23.                 //log.Error("error", new Exception("在這裏發生了一個異常,Error Number:"+random.Next())); 
  24.                 //記錄嚴重錯誤 
  25.                 //log.Fatal("fatal", new Exception("在發生了一個致命錯誤,Exception Id:"+random.Next())); 
  26.                 //記錄一般信息 
  27.                 //log.Info("提示:系統正在運行"); 
  28.                 //記錄調試信息 
  29.                 //log.Debug("調試信息:debug"); 
  30.                 //記錄警告信息 
  31.                 //log.Warn("警告:warn"); 
  32.             } 
  33.             Console.WriteLine("日誌記錄完畢。"); 
  34.             Console.Read(); 
  35.  
  36.         } 
  37.     } 

在WebForm中也可以使用Log4net,下面是一個在ASP.NET中使用Log4Net的例子:

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Web; 
  4. using System.Web.UI; 
  5. using System.Web.UI.WebControls; 
  6. using log4net; 
  7. using System.Reflection; 
  8.  
  9. //如果是web項目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure();  
  10. [assembly: log4net.Config.XmlConfigurator(Watch = true)] 
  11. public partial class _Default : System.Web.UI.Page  
  12.     protected void Page_Load(object sender, EventArgs e) 
  13.     { 
  14.         if (!Page.IsPostBack) 
  15.         { 
  16.             Random random = new Random(); 
  17.             for (int i = 0; i < 1; i++) 
  18.             { 
  19.                 //創建日誌記錄組件實例 
  20.                 ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
  21.  
  22.                 //ILog log = log4net.LogManager.GetLogger(typeof(Program)); 
  23.                 //記錄錯誤日誌 
  24.                 //log.Error("error", new Exception("在這裏發生了一個異常,Error Number:"+random.Next())); 
  25.                 //記錄嚴重錯誤 
  26.                 //log.Fatal("fatal", new Exception("在發生了一個致命錯誤,Exception Id:"+random.Next())); 
  27.                 //記錄一般信息 
  28.                 //log.Info("提示:系統正在運行"); 
  29.                 //記錄調試信息 
  30.                 //log.Debug("調試信息:debug"); 
  31.                 //記錄警告信息 
  32.                 log.Warn("警告:warn"); 
  33.                 Response.Write("日誌記錄完畢。"); 
  34.             } 
  35.         } 
  36.     } 

可以看出它們的代碼基本沒有區別。

下面是一個在WinForm下的config文件的完整配置,該配置文件所使用的代碼就是在上面所使用到的代碼,使用LogFileAppender、ConsoleAppender、EventLogAppender、AdoNetAppender_SQLite、RollingFileAppender、RollingLogFileAppender_DateFormat方式記錄日誌都在本地通過測試。完整的config文件代碼如下:

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.   <configSections> 
  4.     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> 
  5.   </configSections> 
  6.   <appSettings> 
  7.     <!-- To enable internal log4net logging specify the  
  8.              following appSettings key --> 
  9.      <add key="log4net.Internal.Debug" value="true"/>  
  10.   </appSettings> 
  11.   <log4net> 
  12.     <!--定義輸出到文件中--> 
  13.     <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> 
  14.       <!--每條日誌末尾的文字說明--> 
  15.       <footer value="by 周公" /> 
  16.       <!--定義文件存放位置--> 
  17.       <file value="LogFileAppender_log.txt" /> 
  18.       <appendToFile value="true" /> 
  19.       <datePattern value="yyyyMMdd-HH:mm:ss" /> 
  20.       <layout type="log4net.Layout.PatternLayout"> 
  21.         <!--每條日誌末尾的文字說明--> 
  22.         <footer value="by 周公" /> 
  23.         <!--輸出格式--> 
  24.         <!--樣例:2010-11-17 15:50:23,443 [9] (D:/CSProjects/Log4NetDemo/Log4NetDemo/Program.cs:27) FATAL Log4NetDemo.Program [(null)] - fatal 
  25. System.Exception: 在發生了一個致命錯誤,Exception Id:548828745--> 
  26.         <conversionPattern value="記錄時間:%date 線程ID:[%thread] 日誌級別:文件:所在行%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" /> 
  27.       </layout> 
  28.     </appender> 
  29.     <!--定義輸出到控制檯命令行中--> 
  30.     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
  31.       <layout type="log4net.Layout.PatternLayout"> 
  32.         <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" /> 
  33.       </layout> 
  34.     </appender> 
  35.     <!--使用Rolling方式記錄日誌 
  36.     每個日誌文件最大100KB,生成的日誌文件名會是log.txt.1,log.txt.2 ...log.txt.10 
  37.     如果記錄的日誌超過10個,會從log.txt.1開始覆蓋 
  38.     --> 
  39. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
  40.   <file value="RollingFileAppender_log.txt" /> 
  41.   <appendToFile value="true" /> 
  42.   <rollingStyle value="Size" /> 
  43.   <maxSizeRollBackups value="10" /> 
  44.   <maximumFileSize value="100KB" /> 
  45.   <staticLogFileName value="true" /> 
  46.   <layout type="log4net.Layout.PatternLayout"> 
  47.     <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" /> 
  48.   </layout> 
  49. </appender> 
  50.     <!--使用Rolling方式記錄日誌 
  51.     按照日來記錄日誌 
  52.     --> 
  53. <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender"> 
  54.   <file value="RollingLogFileAppender_DateFormat_log.txt" /> 
  55.   <appendToFile value="true" /> 
  56.   <rollingStyle value="Date" /> 
  57.   <!--<datePattern value="yyyyMMdd-HHmm" />--> 
  58.   <datePattern value="yyyyMMdd" /> 
  59.   <layout type="log4net.Layout.PatternLayout"> 
  60.     <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" /> 
  61.   </layout> 
  62. </appender> 
  63.  
  64.     <!--記錄到SQLite這樣的單機數據庫中去 
  65.     創SQLite表的SQL語句: 
  66.     CREATE TABLE Log ( 
  67.     LogId        INTEGER PRIMARY KEY, 
  68.     Date        DATETIME NOT NULL, 
  69.     Level        VARCHAR(50) NOT NULL, 
  70.     Logger        VARCHAR(255) NOT NULL, 
  71.     Source        VARCHAR(255) NOT NULL, 
  72.     Message        TEXT DEFAULT NULL 
  73.     ); 
  74.     --> 
  75. <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender"> 
  76.   <bufferSize value="100" /> 
  77.   <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" /> 
  78.   <!--SQLite連接字符串--> 
  79.   <connectionString value="Data Source=c://log4net.db;Version=3;" /> 
  80.   <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" /> 
  81.   <parameter> 
  82.     <parameterName value="@Date" /> 
  83.     <dbType value="DateTime" /> 
  84.     <layout type="log4net.Layout.RawTimeStampLayout" /> 
  85.   </parameter> 
  86.   <parameter> 
  87.     <parameterName value="@Level" /> 
  88.     <dbType value="String" /> 
  89.     <layout type="log4net.Layout.PatternLayout"> 
  90.       <conversionPattern value="%level" /> 
  91.     </layout> 
  92.   </parameter> 
  93.   <parameter> 
  94.     <parameterName value="@Logger" /> 
  95.     <dbType value="String" /> 
  96.     <layout type="log4net.Layout.PatternLayout"> 
  97.       <conversionPattern value="%logger" /> 
  98.     </layout> 
  99.   </parameter> 
  100.   <parameter> 
  101.     <parameterName value="@Source" /> 
  102.     <dbType value="String" /> 
  103.     <layout type="log4net.Layout.PatternLayout"> 
  104.       <conversionPattern value="%file:%line" /> 
  105.     </layout> 
  106.   </parameter> 
  107.   <parameter> 
  108.     <parameterName value="@Message" /> 
  109.     <dbType value="String" /> 
  110.     <layout type="log4net.Layout.PatternLayout"> 
  111.       <conversionPattern value="%message" /> 
  112.     </layout> 
  113.   </parameter> 
  114. </appender> 
  115.     <!--定義輸出到SQL Server數據庫中--> 
  116.     <!-- 
  117.     在SQL Server中創建表的SQL語句 
  118.     CREATE TABLE [dbo].[Log] ( 
  119.     [Id] [int] IDENTITY (1, 1) NOT NULL, 
  120.     [Date] [datetime] NOT NULL, 
  121.     [Thread] [varchar] (255) NOT NULL, 
  122.     [Level] [varchar] (50) NOT NULL, 
  123.     [Logger] [varchar] (255) NOT NULL, 
  124.     [Message] [varchar] (4000) NOT NULL, 
  125.     [Exception] [varchar] (2000) NULL 
  126. ); 
  127.     --> 
  128.     <appender name="AdoNetAppender_SQLServer" type="log4net.Appender.AdoNetAppender"> 
  129.       <bufferSize value="100" /> 
  130.       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data" /> 
  131.       <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" /> 
  132.       <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 
  133.       <parameter> 
  134.         <parameterName value="@log_date" /> 
  135.         <dbType value="DateTime" /> 
  136.         <layout type="log4net.Layout.RawTimeStampLayout" /> 
  137.       </parameter> 
  138.       <parameter> 
  139.         <parameterName value="@thread" /> 
  140.         <dbType value="String" /> 
  141.         <size value="255" /> 
  142.         <layout type="log4net.Layout.PatternLayout"> 
  143.           <conversionPattern value="%thread" /> 
  144.         </layout> 
  145.       </parameter> 
  146.       <parameter> 
  147.         <parameterName value="@log_level" /> 
  148.         <dbType value="String" /> 
  149.         <size value="50" /> 
  150.         <layout type="log4net.Layout.PatternLayout"> 
  151.           <conversionPattern value="%level" /> 
  152.         </layout> 
  153.       </parameter> 
  154.       <parameter> 
  155.         <parameterName value="@logger" /> 
  156.         <dbType value="String" /> 
  157.         <size value="255" /> 
  158.         <layout type="log4net.Layout.PatternLayout"> 
  159.           <conversionPattern value="%logger" /> 
  160.         </layout> 
  161.       </parameter> 
  162.       <parameter> 
  163.         <parameterName value="@message" /> 
  164.         <dbType value="String" /> 
  165.         <size value="4000" /> 
  166.         <layout type="log4net.Layout.PatternLayout"> 
  167.           <conversionPattern value="%message" /> 
  168.         </layout> 
  169.       </parameter> 
  170.       <parameter> 
  171.         <parameterName value="@exception" /> 
  172.         <dbType value="String" /> 
  173.         <size value="2000" /> 
  174.         <layout type="log4net.Layout.ExceptionLayout" /> 
  175.       </parameter> 
  176.     </appender> 
  177.     <!--定義輸出到Oracle9i中--> 
  178.     <!-- 
  179.     在Oracle9i中創建表的SQL語句 
  180.     create table log ( 
  181.    Datetime timestamp(3), 
  182.    Thread varchar2(255), 
  183.    Log_Level varchar2(255), 
  184.    Logger varchar2(255), 
  185.    Message varchar2(4000) 
  186.    ); 
  187.     --> 
  188.     <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender"> 
  189.       <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient" /> 
  190.       <connectionString value="data source=[mydatabase];User ID=[user];Password=[password]" /> 
  191.       <commandText value="INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)" /> 
  192.       <bufferSize value="128" /> 
  193.       <parameter> 
  194.         <parameterName value=":log_date" /> 
  195.         <dbType value="DateTime" /> 
  196.         <layout type="log4net.Layout.RawTimeStampLayout" /> 
  197.       </parameter> 
  198.       <parameter> 
  199.         <parameterName value=":thread" /> 
  200.         <dbType value="String" /> 
  201.         <size value="255" /> 
  202.         <layout type="log4net.Layout.PatternLayout"> 
  203.           <conversionPattern value="%thread" /> 
  204.         </layout> 
  205.       </parameter> 
  206.       <parameter> 
  207.         <parameterName value=":log_level" /> 
  208.         <dbType value="String" /> 
  209.         <size value="50" /> 
  210.         <layout type="log4net.Layout.PatternLayout"> 
  211.           <conversionPattern value="%level" /> 
  212.         </layout> 
  213.       </parameter> 
  214.       <parameter> 
  215.         <parameterName value=":logger" /> 
  216.         <dbType value="String" /> 
  217.         <size value="255" /> 
  218.         <layout type="log4net.Layout.PatternLayout"> 
  219.           <conversionPattern value="%logger" /> 
  220.         </layout> 
  221.       </parameter> 
  222.       <parameter> 
  223.         <parameterName value=":message" /> 
  224.         <dbType value="String" /> 
  225.         <size value="4000" /> 
  226.         <layout type="log4net.Layout.PatternLayout"> 
  227.           <conversionPattern value="%message" /> 
  228.         </layout> 
  229.       </parameter> 
  230.     </appender> 
  231.     <!--定義輸出到IBM DB2中--> 
  232.     <!-- 
  233.     在DB2中創建表的SQL語句 
  234.     CREATE TABLE "myschema.LOG" ( 
  235.     "ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY ( 
  236.         START WITH +1 
  237.         INCREMENT BY +1 
  238.         MINVALUE +1 
  239.         MAXVALUE +2147483647 
  240.         NO CYCLE 
  241.         NO CACHE 
  242.         NO ORDER 
  243.     ), 
  244.     "DATE" TIMESTAMP NOT NULL, 
  245.     "THREAD" VARCHAR(255) NOT NULL, 
  246.     "LEVEL" VARCHAR(500) NOT NULL, 
  247.     "LOGGER" VARCHAR(255) NOT NULL, 
  248.     "MESSAGE" VARCHAR(4000) NOT NULL, 
  249.     "EXCEPTION" VARCHAR(2000) 
  250. IN "LRGTABLES"; 
  251.     --> 
  252.     <appender name="AdoNetAppender_DB2" type="log4net.Appender.AdoNetAppender"> 
  253.       <bufferSize value="100" /> 
  254.       <connectionType value="IBM.Data.DB2.DB2Connection,IBM.Data.DB2" /> 
  255.       <connectionString value="server=192.168.0.0;database=dbuser;user Id=username;password=password;persist security info=true" /> 
  256.       <commandText value="INSERT INTO myschema.Log (Date,Thread,Level,Logger,Message,Exception) VALUES (@log_date,@thread,@log_level,@logger,@message,@exception)" /> 
  257.       <parameter> 
  258.         <parameterName value="@log_date" /> 
  259.         <dbType value="DateTime" /> 
  260.         <layout type="log4net.Layout.RawTimeStampLayout" /> 
  261.       </parameter> 
  262.       <parameter> 
  263.         <parameterName value="@thread" /> 
  264.         <dbType value="String" /> 
  265.         <size value="255" /> 
  266.         <layout type="log4net.Layout.PatternLayout"> 
  267.           <conversionPattern value="%thread" /> 
  268.         </layout> 
  269.       </parameter> 
  270.       <parameter> 
  271.         <parameterName value="@log_level" /> 
  272.         <dbType value="String" /> 
  273.         <size value="500" /> 
  274.         <layout type="log4net.Layout.PatternLayout"> 
  275.           <conversionPattern value="%level" /> 
  276.         </layout> 
  277.       </parameter> 
  278.       <parameter> 
  279.         <parameterName value="@logger" /> 
  280.         <dbType value="String" /> 
  281.         <size value="255" /> 
  282.         <layout type="log4net.Layout.PatternLayout"> 
  283.           <conversionPattern value="%logger" /> 
  284.         </layout> 
  285.       </parameter> 
  286.       <parameter> 
  287.         <parameterName value="@message" /> 
  288.         <dbType value="String" /> 
  289.         <size value="4000" /> 
  290.         <layout type="log4net.Layout.PatternLayout"> 
  291.           <conversionPattern value="%message" /> 
  292.         </layout> 
  293.       </parameter> 
  294.       <parameter> 
  295.         <parameterName value="@exception" /> 
  296.         <dbType value="String" /> 
  297.         <size value="2000" /> 
  298.         <layout type="log4net.Layout.ExceptionLayout" /> 
  299.       </parameter> 
  300.     </appender> 
  301.     <!--定義輸出到windows事件中--> 
  302.     <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
  303.       <layout type="log4net.Layout.PatternLayout"> 
  304.         <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
  305.       </layout> 
  306.     </appender> 
  307.     <!--定義輸出到數據庫中,這裏舉例輸出到Access數據庫中,數據庫爲C盤的log4net.mdb 
  308.     創建Access表的SQL語句: 
  309.     --> 
  310.     <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> 
  311.       <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/log4net.mdb" /> 
  312.       <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> 
  313.       <!--定義各個參數--> 
  314.       <parameter> 
  315.         <parameterName value="@logDate" /> 
  316.         <dbType value="String" /> 
  317.         <size value="240" /> 
  318.         <layout type="log4net.Layout.PatternLayout"> 
  319.           <conversionPattern value="%date" /> 
  320.         </layout> 
  321.       </parameter> 
  322.       <parameter> 
  323.         <parameterName value="@thread" /> 
  324.         <dbType value="String" /> 
  325.         <size value="240" /> 
  326.         <layout type="log4net.Layout.PatternLayout"> 
  327.           <conversionPattern value="%thread" /> 
  328.         </layout> 
  329.       </parameter> 
  330.       <parameter> 
  331.         <parameterName value="@logLevel" /> 
  332.         <dbType value="String" /> 
  333.         <size value="240" /> 
  334.         <layout type="log4net.Layout.PatternLayout"> 
  335.           <conversionPattern value="%level" /> 
  336.         </layout> 
  337.       </parameter> 
  338.       <parameter> 
  339.         <parameterName value="@logger" /> 
  340.         <dbType value="String" /> 
  341.         <size value="240" /> 
  342.         <layout type="log4net.Layout.PatternLayout"> 
  343.           <conversionPattern value="%logger" /> 
  344.         </layout> 
  345.       </parameter> 
  346.       <parameter> 
  347.         <parameterName value="@message" /> 
  348.         <dbType value="String" /> 
  349.         <size value="240" /> 
  350.         <layout type="log4net.Layout.PatternLayout"> 
  351.           <conversionPattern value="%message" /> 
  352.         </layout> 
  353.       </parameter> 
  354.     </appender> 
  355.     <!--定義日誌的輸出媒介,下面定義日誌以四種方式輸出。也可以下面的按照一種類型或其他類型輸出。--> 
  356. <root> 
  357.   <!--文件形式記錄日誌--> 
  358.   <appender-ref ref="LogFileAppender" /> 
  359.   <!--控制檯控制顯示日誌--> 
  360.   <appender-ref ref="ConsoleAppender" /> 
  361.   <!--Windows事件日誌--> 
  362.   <!--<appender-ref ref="EventLogAppender" />--> 
  363.   <!--SQLite日誌--> 
  364.   <!--<appender-ref ref="AdoNetAppender_SQLite" />--> 
  365.   <!--RollingFileAppender事件日誌--> 
  366.   <appender-ref ref="RollingFileAppender" /> 
  367.   <!--RollingFileAppender事件日誌,每天一個日誌--> 
  368.   <appender-ref ref="RollingLogFileAppender_DateFormat" /> 
  369.   <!-- 如果不啓用相應的日誌記錄,可以通過這種方式註釋掉 
  370.   <appender-ref ref="AdoNetAppender_Access" /> 
  371.   --> 
  372. </root> 
  373.  
  374.   </log4net> 
  375.   <!--<system.diagnostics> 
  376.     <trace autoflush="true"> 
  377.       <listeners> 
  378.         <add 
  379.             name="textWriterTraceListener" 
  380.             type="System.Diagnostics.TextWriterTraceListener" 
  381.             initializeData="D:/CSProjects/Log4NetDemo/Log4NetDemo/bin/log4net.txt" /> 
  382.       </listeners> 
  383.     </trace> 
  384.   </system.diagnostics>--> 
  385.  
  386. </configuration> 

總結:

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