server|sqlserver|資料|資料庫
資料庫日誌表的準備
在資料庫中準備一個這樣的表,mail_web_log:
產生指令碼:
CREATE TABLE [dbo].[mail_web_log] (
[nId] [int] IDENTITY (1, 1) NOT NULL ,
[dtDate] [datetime] NOT NULL ,
[sThread] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[sLevel] [varchar] (200) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[sLogger] [varchar] (200) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[sMessage] [varchar] (2000) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[sException] [varchar] (4000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[mail_web_log] WITH NOCHECK ADD
CONSTRAINT [PK_mail_web_log] PRIMARY KEY CLUSTERED
(
[nId]
) ON [PRIMARY]
GO
其中,sLevel欄位代表日誌的層級;sLogger欄位代表日誌是由哪一個類或者檔案產生的,如
“iNotes.Default.Page_Load(c:\mail\mailsource\default.aspx.cs:269)”;sMessage欄位代表日誌的內容。
Web.config中Log4net的配置
注意其中“ADONetAppender”節點的寫法,以及各個欄位的列印方法。
一般來說,我們對每一個日誌欄位定義一個“<Layout type="log4net.Layout.PatternLayout">”節點以告訴log4net如何輸出,在這個節點之下,我們需要配置
<conversionPattern value="%t" />
%t在log4net中專門指的是線程名。
下面我們對“%d %t %p %l %m %n”一一講解:
l %d輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyyy-MM-dd HH:mm:ss},輸出類似:2005-7-19 17:49:27,剛好適合插入SQLServer;
l %t 產生該日誌事件的線程名;
l %p 日誌的log_level,如DEBUG、WARN或者INFO;
l %c 輸出所屬的類目,通常就是所在類的全名,如“iNotes.Default”;
l %m 日誌的內容;
l %l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。如write2database.main(write2database.java:33);
%n 輸出一個斷行符號分行符號,Windows平台為“\r\n”,Unix平台為“\n”
對於web網站的web.config檔案,需要如下配置,這部分是參考了cgq214 的Blog講到的寫法,同時根據實際效果作了點修正:
配置:
<log4net>
…
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="10" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="server=192.168.1.112;database=domino;uid=sa;pwd=;timeout=300;" />
<commandText value="INSERT INTO mail_web_log ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) 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="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
</root>
<!-- Specify the level for some specific categories -->
<logger name="iNotes">
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<appender-ref ref="RollingLogFileAppender"/>
<appender-ref ref="ADONetAppender" />
</logger> </log4net>