asp.net利用log4net寫入日志到SqlServer數據庫
asp.net利用log4net寫入日志到SqlServer數據庫,Log4net是一個開源的錯誤日志記錄項目,易用性強,源自log4j,品質值得信賴。 下面就我的安裝部署log4net到MS sql server的經驗與大家分享。
下載log4net的Dll文件并引入到項目中,在你的web主項目(比如MainWeb.csproj)添加對log4net.dll的引用,并在相應的Globall.cs文件中的Application_Start 事件中寫入
protected void Application_Start(Object sender, EventArgs e) { // log4net.Config.XmlConfigurator.Configure( new System.IO.FileInfo( "log4net.config" )); }
在這個項目對應的Assembly.cs文件中添加一行
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config" , Watch = true )]
這里有個地方需要注意
如果我的主項目是純粹的代碼分離后的aspx\ascx文件, 不含cs文件,那么中需要在飽含cs文件的項目(比如common.web.csproj)文件中添加這兩行代碼
舉個例子
解決方案如下:
MySolution.Sln
|-----common.Web.csproj(包含cs文件)
|-----Business1.Web.csproj(包含cs文件,繼承自common.Web.csproj)
|-----Business********.Web.csproj(包含cs文件,繼承自common.Web.csproj)
|-----BusinessX.Web.csproj(包含cs文件,繼承自common.Web.csproj)
|-----MainWeb.csproj(不包含cs文件)
此時, 只需要在 common.Web.csproj 中做以上動作就可以了!其他項目只需要引用 dll即可。
第三步:添加logn4net.confgi在主項目根目錄下:與web.config同路徑,之所以不寫入web,config文件, 是因為這樣可以單獨修改調試部署,也就是非侵入式安裝的思想。呵呵。
內容大概如下:
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <!--Log4net Begin by Tony 2008.11.20--> <log4net> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <bufferSize value="10" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="DATABASE=DBErrorLogs;SERVER=myserver;UID=user;PWD=pwdpwd;Connect Timeout=15;" /> <commandText value="INSERT INTO ErrorLog ([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="100" /> <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="500" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="3000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%m" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="4000" /> <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"/> <appender-ref ref="ADONetAppender" /> </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="ADONetAppender"/> </logger> <logger name="StellaLogger"> <level value="ALL"/> <appender-ref ref="AdoNetAppender" /> </logger> </log4net> <!--Log4net End--> </configuration>
基本完成了!需要注意的一個參數
數據庫生成腳本
CREATE TABLE [dbo].[ErrorLog]( [nId] [bigint] IDENTITY(1,1) NOT NULL, [dtDate] [datetime] NOT NULL, [sThread] [varchar](100) NOT NULL, [sLevel] [varchar](200) NOT NULL, [sLogger] [varchar](500) NOT NULL, [sMessage] [varchar](3000) NOT NULL, [sException] [varchar](4000) NULL)
第四步:在需要記錄的每個類中添加如下代碼
private static log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
給出一個例子
private void TestLog() { try { // } catch (Exception ex) { Loghandle by Tony 2008.11.21#region Loghandle by Tony 2008.11.21 string loginid = EmptyString; //if (user != null) { loginid = user.LoginID; } myLogger.Error(GetErrorMessage(loginid, 1), ex); //Debug("系統已記錄錯誤,請聯系管理員!"); return; //Debug(ErrorHandle.GetErrorInfoByID(999), this.ClientID); return; #endregion } }
<bufferSize value="10" />,表示是記錄10 條到緩沖區,滿10條后再寫入SQL server
調試時可以改為1,實際應用建議為100