程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> log4net寫入到SQL server的基本配置(downmoon)

log4net寫入到SQL server的基本配置(downmoon)

編輯:關於SqlServer

  log4net是一個開源的錯誤日志記錄項目,易用性強,源自log4j,品質值得信賴。

  下面匯報一下我的安裝部署log4net到MS SQL Server的經驗。

  一、首先是下載log4net最新版

  地址:http://logging.apache.org/log4net/

  直接引用dll也行,我是把下載的源碼在Vs2005下編譯成log4net.dll

  二、在你的web主項目(比如MainWeb.csproj)添加對log4net.dll的引用,並在相應的Globall.cs文件中的Application_Start事件中寫入

  Code

protected void Application_Start(Object sender, EventArgs e)
    {/**/////
      log4net.Config.XMLConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
    }

  在這個項目對應的Assembly.cs文件中添加一行

  Code

[assembly: log4net.Config.XMLConfigurator(ConfigFile = "log4net.config", Watch = true)]

  這裡有個地方需要注意

  如果我的主項目是純粹的代碼分離後的ASPxascx文件, 不含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文件, 是因為這樣可以單獨修改調試部署,也就是非侵入式安裝的思想。呵呵。

  內容大概如下:

  Code

<?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>

  具體的可以看看官方文檔

  http://logging.apache.org/log4net/release/sdk/index.Html

  基本完成了!需要注意的一個參數

  <bufferSize value="10" />,表示是記錄10 條到緩沖區,滿10條後再寫入SQL Server

  調試時可以改為1,實際應用建議為100

  數據庫生成腳本

  Code

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
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,
CONSTRAINT [PK_ErrorLog] PRIMARY KEY CLUSTERED
(
  [nId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[ErrorLog] ADD DEFAULT (getdate()) FOR [dtDate]
GO

  第四步:

  在需要記錄的每個類中添加如下代碼

  Code

private static log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethoDBase.GetCurrentMethod().DeclaringType);



  給出一個例子

  Code

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
      }
    }

  記錄的樣式如下:

  Code

  <table><tr><td>nId</td>   
  <td>dtDate</td> <td>sThread</td> <td>sLevel</td> <td>sLogger</td> <td>sMessage</td> <td>sException</td>
  </tr>
  <tr><td>1    </td>
  <td>2008-11-21 11:03:20.470</td> <td>1904</td> <td>ERROR Agronet.Product.Web.UI.Controls.Vegnet.Detail</td> <td>10.103.33.10</td> <td>System.OverflowException: 值對於 Int16 太大或太小。</td> <td> ---> System.OverflowException: 值對於 Int32 太大或太小。 在 System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 在 System.Int16.Parse(String s, NumberStyles style, NumberFormatInfo info) --- 內部異常堆棧跟蹤的結尾 --- 在 System.Int16.Parse(String s, NumberStyles style, NumberFormatInfo info) 在 System.Int16.Parse(String s) 在 Agronet.Product.Web.UI.Controls.Vegnet.Detail.BindList() 位置 P:TestWebUIControlsVegnetDetail.cs:行號 141</td>
  </tr></table>

  OK! 結束,

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved