也用 Log4Net 之將日志記錄到數據庫的配置 (一)
前段時間我一直想做一個通用一點的日志記錄系統,可以便於不同的業務組調用進行日志記錄及分析。本來打算着自己下手寫一個,后面發現各業務組可能會需要不同的記錄方式,比如利用數據庫來記錄,用txt的文件形式來記錄,當然,這些都是最常用的記錄方式。而且不同的業務組都希望有自己的記錄數據表,不希望和其他業務組的數據混在一起。於是我先前設想的架構方式也就付之一炬了,因為不夠靈活,而且實現難度大、周期長。恰在此時想起了之前做項目的時候用的 Log4Net 的開源日志框架,於是又從新Google了一下,發現,真棒。今天我就來給大家介紹一下 Log4Net。
介紹:Log4Net是一個功能著名的開源日志記錄組件。通過它可以將.net應用程序的日志記錄到多種介質之中,包括:文件、控制台、window事物日志和數據庫中(MS SQL Server、Access、Oracle9i、DB2、SQLite)中,並且我們還可以設置和標示日志的級別等。
對於 Log4Net 我想大家都已經不陌生了,所以我就直接奔入主題,我主講如何進行數據庫的配置及自定義表字段(即自定義屬性)。關於Log4Net 的配置說明,網上有太多太多的內容了,關於數據庫的配置網上也有很多。但是我發現很多都是轉來轉去,並沒有能真正解決數據庫配置及自定義表字段的問題,大多數人都出的解決方案也只是拼起來的,不能用。
好了,在.net中使用 Log4Net 來將日志記錄到數據庫,現在開始:
(1)、我們首先需要一個配置文件,我將其命名為 Log4Net.Config,其內容如下:
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <root> <level value="INFO"></level> <appender-ref ref="AdoNetAppender_SQL"/> </root> <logger name="WebLogger"> <level value="INFO"/> <appender-ref ref="ADONetAppender" /> </logger> <logger name="WebTest"> <level value="INFO"/> <appender-ref ref="ADONetTest" /> </logger> <!--SQL數據庫--> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <bufferSize value="10"/> <!-- SQL數據源 ,本地安裝SQL客戶端--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <!-- SQL連接字符串--> <connectionString value="data source=SHUJU-BAILING\SQLEXPRESS;initial catalog=LogSys;integrated security=False;persist security info=True;User ID=sa;Password=123456" /> <commandText value="INSERT INTO Log ([RecordTime],[LevelName],[Message],[Exception],[UserID]) VALUES (@log_date, @log_level, @message, @exception, @UserID)"/> <parameter> <parameterName value="@log_date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </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="@exception"/> <dbType value="String"/> <size value="2000"/> <layout type="log4net.Layout.ExceptionLayout"/> </parameter> <parameter> <parameterName value="@message"/> <dbType value="String"/> <size value="4000"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message"/> </layout> </parameter> <!--自定義成員 --> <parameter> <parameterName value="@UserID" /> <dbType value="Int32" /> <layout type="JJ.Data.LogCommon.CustomLayout"> <conversionPattern value="%UserID" /> </layout> </parameter> </appender> <!--SQL數據庫--> <appender name="ADONetTest" type="log4net.Appender.ADONetAppender"> <bufferSize value="10"/> <!-- SQL數據源 ,本地安裝SQL客戶端--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <!-- SQL連接字符串--> <connectionString value="data source=SHUJU-BAILING\SQLEXPRESS;initial catalog=LogSys;integrated security=False;persist security info=True;User ID=sa;Password=123456" /> <commandText value="INSERT INTO LogTest ([RecordTime],[LevelName],[Message],[Exception],[UserID]) VALUES (@log_date, @log_level, @message, @exception, @UserID)"/> <parameter> <parameterName value="@log_date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </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="@exception"/> <dbType value="String"/> <size value="2000"/> <layout type="log4net.Layout.ExceptionLayout"/> </parameter> <parameter> <parameterName value="@message"/> <dbType value="String"/> <size value="4000"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message"/> </layout> </parameter> <!--自定義成員 --> <parameter> <parameterName value="@UserID" /> <dbType value="Int32" /> <layout type="JJ.Data.LogCommon.CustomLayout"> <conversionPattern value="%UserID" /> </layout> </parameter> </appender> <!--<root> <level value="DEBUG" /> <appender-ref ref="ADONetAppender" /> </root>--> </log4net> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
這是一個非常完整的 Log4Net 的配置文件,細心的同學會發現,我配置了兩張一模一樣表,是的,這是我為了做測試用的,我想試試他能不能根據不同的業務需要將不同的日志分別記錄到不同的表中(實驗證明完全沒有問題 )。
<logger name="WebLogger"> <level value="INFO"/> <appender-ref ref="ADONetAppender" /> </logger> <logger name="WebTest"> <level value="INFO"/> <appender-ref ref="ADONetTest" /> </logger>
上面的這段配置我想特別強調一下,Logger 配置接點告訴我們,日志信息將分別以ADONetAppender 和 ADONetTest的形式進行輸出,而且這兩種形式正是我們上面配置的兩個表,你仔細觀察 appender 配置節的 name 屬性,哈哈,是不是一下子就明白了。其實如果我們真正的理解了 Log4Net 配置說明,其實 Log4Net 的使用也就自然而然的掌握了,其它的就是多看一下相應的API文檔。
好了,今天我們主要講一下 Log4Net 將日志輸入到數據庫的配置文件,我們先理解一下,當然后台還是寫代碼的,我會在明天把后台代碼整理和發表。因為一下字都寫出來了有點暈,大家看着也暈,所以我們慢慢來寫。
就先寫到這里,我是百靈,明天見。
