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>節點中增加配置(如果沒有這個節點請手動增加),如下:
- <configSections>
- <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
- </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>節點,配置如下:
- <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
- <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <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>
當然從上面的配置中的SQL語句中可以看得出這個表的參數,日誌表的創建語句如下:
- create table log (
- Datetime timestamp(3),
- Thread varchar2(255),
- Log_Level varchar2(255),
- Logger varchar2(255),
- Message varchar2(4000)
- );
在本例中周公採用了將日誌記錄到SQLite這個單機數據庫的方式,並且還將記錄記錄日誌時的文件名和行號,創建SQLite的SQL語句如下:
- CREATE TABLE Log (
- LogId INTEGER PRIMARY KEY,
- Date DATETIME NOT NULL,
- Level VARCHAR(50) NOT NULL,
- Logger VARCHAR(255) NOT NULL,
- Source VARCHAR(255) NOT NULL,
- Message TEXT DEFAULT NULL
- );
增加的< appender>節點配置如下:
- <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">
- <bufferSize value="100" />
- <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" />
- <!--SQLite連接字符串-->
- <connectionString value="Data Source=c://log4net.db;Version=3;" />
- <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" />
- <parameter>
- <parameterName value="@Date" />
- <dbType value="DateTime" />
- <layout type="log4net.Layout.RawTimeStampLayout" />
- </parameter>
- <parameter>
- <parameterName value="@Level" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%level" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@Logger" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%logger" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@Source" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%file:%line" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@Message" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%message" />
- </layout>
- </parameter>
- </appender>
從上面的配置中可以看出插入數據的SQL語句及參數信息,下面的<parameter>節點就是指定插入的數據,比如我們指定SQL語句中的"@Source"參數來源於log4net中的"%file:%line"參數,也就是這兩個參數用“:”用連接起來。
控制日誌文件大小的問題
對於一個長時間使用並且有大量業務日誌的系統來說,如果使用FileAppender將日誌一直記錄到一個文件中會引起性能低下的問題,我曾見過有個系統的日誌文件達到了800多M,最後系統無法及時響應了,在這種情況下可考慮使用RollingFileAppender循環記錄日誌,一種是指定文件的最大長度,如果超過了就重新生成一個文件,如下面的配置:
- <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
- <file value="RollingFileAppender_log.txt" />
- <appendToFile value="true" />
- <rollingStyle value="Size" />
- <maxSizeRollBackups value="10" />
- <maximumFileSize value="100KB" />
- <staticLogFileName value="true" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
在上面的配置中,每個日誌文件最大100KB,最大日誌文件個數是10生成的日誌文件名會是RollingFileAppender_log.txt.1, RollingFileAppender_log.txt.2 ... RollingFileAppender_log.txt.10,如果記錄的日誌超過10個,會從RollingFileAppender_log.txt.1開始覆蓋。
還有一種方式就是按照日期記錄日誌,它的配置如下:
- <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">
- <file value="RollingLogFileAppender_DateFormat_log.txt" />
- <appendToFile value="true" />
- <rollingStyle value="Date" />
- <!--<datePattern value="yyyyMMdd-HHmm" />-->
- <datePattern value="yyyyMMdd" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
這樣一來,每天的日誌都寫入到一個文件中,當天的日誌文件名爲“RollingLogFileAppender_DateFormat_log.txt”,非當天的日誌都會帶上當天的日期,如“RollingLogFileAppender_DateFormat_log.txt20101117”表示2010年11月17日的日誌,這樣就可以很方便地區分每天的日誌了,將來查找起來也相當方便。
在配置中啓用和關閉日誌
在config文件中可以很方便地關閉和啓用日誌,就是在<root>進行配置,如下就是一個例子:
- <root>
- <!--文件形式記錄日誌-->
- <appender-ref ref="LogFileAppender" />
- <!--控制檯控制顯示日誌-->
- <appender-ref ref="ConsoleAppender" />
- <!--Windows事件日誌-->
- <!--<appender-ref ref="EventLogAppender" />-->
- <!--SQLite事件日誌-->
- <appender-ref ref="AdoNetAppender_SQLite" />
- <!--RollingFileAppender事件日誌-->
- <appender-ref ref="RollingFileAppender" />
- <!--RollingFileAppender事件日誌,每天一個日誌-->
- <appender-ref ref="RollingLogFileAppender_DateFormat" />
- <!-- 如果不啓用相應的日誌記錄,可以通過這種方式註釋掉
- <appender-ref ref="AdoNetAppender_Access" />
- -->
- </root>
在上面的例子中可以看出,如果想增加日誌輸出目的地,增加<appender-ref>節點就是了,注意後面的ref是在config中配置的appender name,如果想要取消,刪除或者註釋掉這行就可以了。
Log4Net的使用
首先要添加config文件,在類庫項目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。
下面是一個在WinForm項目中的使用Log4Net的例子:
- using System.Collections.Generic;
- using System.Text;
- using log4net;
- using System.Reflection;
- //注意下面的語句一定要加上,指定log4net使用.config文件來讀取配置信息
- //如果是WinForm(假定程序爲MyDemo.exe,則需要一個MyDemo.exe.config文件)
- //如果是WebForm,則從web.config中讀取相關信息
- [assembly: log4net.Config.XmlConfigurator(Watch = true)]
- namespace Log4NetDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- Random random = new Random();
- for (int i = 0; i < 1; i++)
- {
- //創建日誌記錄組件實例
- //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- ILog log=log4net.LogManager.GetLogger(typeof(Program));
- //記錄錯誤日誌
- //log.Error("error", new Exception("在這裏發生了一個異常,Error Number:"+random.Next()));
- //記錄嚴重錯誤
- //log.Fatal("fatal", new Exception("在發生了一個致命錯誤,Exception Id:"+random.Next()));
- //記錄一般信息
- //log.Info("提示:系統正在運行");
- //記錄調試信息
- //log.Debug("調試信息:debug");
- //記錄警告信息
- //log.Warn("警告:warn");
- }
- Console.WriteLine("日誌記錄完畢。");
- Console.Read();
- }
- }
- }
在WebForm中也可以使用Log4net,下面是一個在ASP.NET中使用Log4Net的例子:
- using System;
- using System.Collections.Generic;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using log4net;
- using System.Reflection;
- //如果是web項目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure();
- [assembly: log4net.Config.XmlConfigurator(Watch = true)]
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!Page.IsPostBack)
- {
- Random random = new Random();
- for (int i = 0; i < 1; i++)
- {
- //創建日誌記錄組件實例
- ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- //ILog log = log4net.LogManager.GetLogger(typeof(Program));
- //記錄錯誤日誌
- //log.Error("error", new Exception("在這裏發生了一個異常,Error Number:"+random.Next()));
- //記錄嚴重錯誤
- //log.Fatal("fatal", new Exception("在發生了一個致命錯誤,Exception Id:"+random.Next()));
- //記錄一般信息
- //log.Info("提示:系統正在運行");
- //記錄調試信息
- //log.Debug("調試信息:debug");
- //記錄警告信息
- log.Warn("警告:warn");
- Response.Write("日誌記錄完畢。");
- }
- }
- }
- }
可以看出它們的代碼基本沒有區別。
下面是一個在WinForm下的config文件的完整配置,該配置文件所使用的代碼就是在上面所使用到的代碼,使用LogFileAppender、ConsoleAppender、EventLogAppender、AdoNetAppender_SQLite、RollingFileAppender、RollingLogFileAppender_DateFormat方式記錄日誌都在本地通過測試。完整的config文件代碼如下:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <configSections>
- <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
- </configSections>
- <appSettings>
- <!-- To enable internal log4net logging specify the
- following appSettings key -->
- <add key="log4net.Internal.Debug" value="true"/>
- </appSettings>
- <log4net>
- <!--定義輸出到文件中-->
- <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
- <!--每條日誌末尾的文字說明-->
- <footer value="by 周公" />
- <!--定義文件存放位置-->
- <file value="LogFileAppender_log.txt" />
- <appendToFile value="true" />
- <datePattern value="yyyyMMdd-HH:mm:ss" />
- <layout type="log4net.Layout.PatternLayout">
- <!--每條日誌末尾的文字說明-->
- <footer value="by 周公" />
- <!--輸出格式-->
- <!--樣例:2010-11-17 15:50:23,443 [9] (D:/CSProjects/Log4NetDemo/Log4NetDemo/Program.cs:27) FATAL Log4NetDemo.Program [(null)] - fatal
- System.Exception: 在發生了一個致命錯誤,Exception Id:548828745-->
- <conversionPattern value="記錄時間:%date 線程ID:[%thread] 日誌級別:文件:所在行%-5level 出錯類:%logger property:[%property{NDC}] - 錯誤描述:%message%newline" />
- </layout>
- </appender>
- <!--定義輸出到控制檯命令行中-->
- <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <!--使用Rolling方式記錄日誌
- 每個日誌文件最大100KB,生成的日誌文件名會是log.txt.1,log.txt.2 ...log.txt.10
- 如果記錄的日誌超過10個,會從log.txt.1開始覆蓋
- -->
- <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
- <file value="RollingFileAppender_log.txt" />
- <appendToFile value="true" />
- <rollingStyle value="Size" />
- <maxSizeRollBackups value="10" />
- <maximumFileSize value="100KB" />
- <staticLogFileName value="true" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <!--使用Rolling方式記錄日誌
- 按照日來記錄日誌
- -->
- <appender name="RollingLogFileAppender_DateFormat" type="log4net.Appender.RollingFileAppender">
- <file value="RollingLogFileAppender_DateFormat_log.txt" />
- <appendToFile value="true" />
- <rollingStyle value="Date" />
- <!--<datePattern value="yyyyMMdd-HHmm" />-->
- <datePattern value="yyyyMMdd" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread](%file:%line) %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <!--記錄到SQLite這樣的單機數據庫中去
- 創SQLite表的SQL語句:
- CREATE TABLE Log (
- LogId INTEGER PRIMARY KEY,
- Date DATETIME NOT NULL,
- Level VARCHAR(50) NOT NULL,
- Logger VARCHAR(255) NOT NULL,
- Source VARCHAR(255) NOT NULL,
- Message TEXT DEFAULT NULL
- );
- -->
- <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">
- <bufferSize value="100" />
- <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral" />
- <!--SQLite連接字符串-->
- <connectionString value="Data Source=c://log4net.db;Version=3;" />
- <commandText value="INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)" />
- <parameter>
- <parameterName value="@Date" />
- <dbType value="DateTime" />
- <layout type="log4net.Layout.RawTimeStampLayout" />
- </parameter>
- <parameter>
- <parameterName value="@Level" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%level" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@Logger" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%logger" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@Source" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%file:%line" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@Message" />
- <dbType value="String" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%message" />
- </layout>
- </parameter>
- </appender>
- <!--定義輸出到SQL Server數據庫中-->
- <!--
- 在SQL Server中創建表的SQL語句
- CREATE TABLE [dbo].[Log] (
- [Id] [int] IDENTITY (1, 1) NOT NULL,
- [Date] [datetime] NOT NULL,
- [Thread] [varchar] (255) NOT NULL,
- [Level] [varchar] (50) NOT NULL,
- [Logger] [varchar] (255) NOT NULL,
- [Message] [varchar] (4000) NOT NULL,
- [Exception] [varchar] (2000) NULL
- );
- -->
- <appender name="AdoNetAppender_SQLServer" type="log4net.Appender.AdoNetAppender">
- <bufferSize value="100" />
- <connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />
- <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
- <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
- <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>
- <parameter>
- <parameterName value="@exception" />
- <dbType value="String" />
- <size value="2000" />
- <layout type="log4net.Layout.ExceptionLayout" />
- </parameter>
- </appender>
- <!--定義輸出到Oracle9i中-->
- <!--
- 在Oracle9i中創建表的SQL語句
- create table log (
- Datetime timestamp(3),
- Thread varchar2(255),
- Log_Level varchar2(255),
- Logger varchar2(255),
- Message varchar2(4000)
- );
- -->
- <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>
- <!--定義輸出到IBM DB2中-->
- <!--
- 在DB2中創建表的SQL語句
- CREATE TABLE "myschema.LOG" (
- "ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (
- START WITH +1
- INCREMENT BY +1
- MINVALUE +1
- MAXVALUE +2147483647
- NO CYCLE
- NO CACHE
- NO ORDER
- ),
- "DATE" TIMESTAMP NOT NULL,
- "THREAD" VARCHAR(255) NOT NULL,
- "LEVEL" VARCHAR(500) NOT NULL,
- "LOGGER" VARCHAR(255) NOT NULL,
- "MESSAGE" VARCHAR(4000) NOT NULL,
- "EXCEPTION" VARCHAR(2000)
- )
- IN "LRGTABLES";
- -->
- <appender name="AdoNetAppender_DB2" type="log4net.Appender.AdoNetAppender">
- <bufferSize value="100" />
- <connectionType value="IBM.Data.DB2.DB2Connection,IBM.Data.DB2" />
- <connectionString value="server=192.168.0.0;database=dbuser;user Id=username;password=password;persist security info=true" />
- <commandText value="INSERT INTO myschema.Log (Date,Thread,Level,Logger,Message,Exception) VALUES (@log_date,@thread,@log_level,@logger,@message,@exception)" />
- <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="500" />
- <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>
- <parameter>
- <parameterName value="@exception" />
- <dbType value="String" />
- <size value="2000" />
- <layout type="log4net.Layout.ExceptionLayout" />
- </parameter>
- </appender>
- <!--定義輸出到windows事件中-->
- <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
- </layout>
- </appender>
- <!--定義輸出到數據庫中,這裏舉例輸出到Access數據庫中,數據庫爲C盤的log4net.mdb
- 創建Access表的SQL語句:
- -->
- <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
- <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/log4net.mdb" />
- <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
- <!--定義各個參數-->
- <parameter>
- <parameterName value="@logDate" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@thread" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%thread" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@logLevel" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%level" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@logger" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%logger" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@message" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%message" />
- </layout>
- </parameter>
- </appender>
- <!--定義日誌的輸出媒介,下面定義日誌以四種方式輸出。也可以下面的按照一種類型或其他類型輸出。-->
- <root>
- <!--文件形式記錄日誌-->
- <appender-ref ref="LogFileAppender" />
- <!--控制檯控制顯示日誌-->
- <appender-ref ref="ConsoleAppender" />
- <!--Windows事件日誌-->
- <!--<appender-ref ref="EventLogAppender" />-->
- <!--SQLite日誌-->
- <!--<appender-ref ref="AdoNetAppender_SQLite" />-->
- <!--RollingFileAppender事件日誌-->
- <appender-ref ref="RollingFileAppender" />
- <!--RollingFileAppender事件日誌,每天一個日誌-->
- <appender-ref ref="RollingLogFileAppender_DateFormat" />
- <!-- 如果不啓用相應的日誌記錄,可以通過這種方式註釋掉
- <appender-ref ref="AdoNetAppender_Access" />
- -->
- </root>
- </log4net>
- <!--<system.diagnostics>
- <trace autoflush="true">
- <listeners>
- <add
- name="textWriterTraceListener"
- type="System.Diagnostics.TextWriterTraceListener"
- initializeData="D:/CSProjects/Log4NetDemo/Log4NetDemo/bin/log4net.txt" />
- </listeners>
- </trace>
- </system.diagnostics>-->
- </configuration>
總結: