[ASP.NET] 使用 Log4net 記錄網站訊息

摘要:[ASP.NET] 使用 Log4net 記錄網站訊息

前言


不管是在網站測試階段或上線階段,記錄網站資訊的Log都是非常重要的事情,

為了避免使用者在執行網站實發生錯誤直接將錯誤畫面丟給使用者看時,通常網站會做錯誤頁面導向,

將比較友善的錯畫面顯是給使用者看,以免使用者感覺好像天崩地裂一樣 (笑)

但不可能秀個 "哎呀~出錯了" 的畫面就沒事了,開發人員必須要知道發生錯誤的是甚麼情況?哪隻程式?

在這邊就必須要當使用者看到友善錯誤畫面時,程式背地裡必需要去紀錄詳細的錯誤訊息,

在.Net裡記錄錯誤的方式有好幾種,例如自己用System.IO.StreamWriter 定義輸出、使用 System.Diagnostics 命名空間或者直接寫入資料庫內,

下面就介紹一下一款我覺得記錄Log還蠻好用的Libaray使用方法吧。

 

範例


使用 Log4net

首先在網站加入 log4net  Lib 的方法有兩種:

1.至Log4net 網站: http://logging.apache.org/log4net/ 找到 Download 下載

2.使用NuGet搜尋log4net後直接安裝

當然推薦使用NuGet的方法比較快速嘍。

加入後方案如下圖:

 

目前的 Log4net 支援多種寫入模式,例如寫文字檔、MSSQL、Access、Oracle等等...看你的需要處理,

這邊就介紹基本的寫入文字檔跟寫入MSSQL的設定,

 

一、寫入文字檔

Step 1.

首先我們要先設定 log4net.config 檔,在專案中加入一個XML檔案並且將檔名修改成 log4net.config,".config"是副檔名喔!

完成後在log4net.config檔案中,加入以下設定:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  
  <log4net>
    <appender name="Console" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <!-- Pattern to output the caller's file name and line number -->
        <conversionPattern value="%date %-5level [%thread] (%file:%line) - %message%newline" />
      </layout>
    </appender>

    <!-- 寫入文字檔設定開始 -->
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
      <file value="D:\TLog\Log_Result.log" />
      <appendToFile value="true" />
      <maximumFileSize value="100KB" />
      <maxSizeRollBackups value="2" />

      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %thread %logger - %message%newline" />
      </layout>
    </appender>
    <!-- 寫入文字檔設定結束 -->

    <root>
      <level value="DEBUG" />
      <appender-ref ref="Console" />
      <appender-ref ref="RollingFile" />
    </root>

  </log4net>
</configuration>

說明:

appender 標籤:

內容為輸出格式的設定

  1. type: 輸出類型,例如 ConsoleAppender 為主控台輸出、RollingFileAppender 為文字檔輸出
  2. file: 輸出檔案的路徑位置
  3. layout: 記錄的格式設定

logger 標籤:

為記錄器,可自訂設定屬性(可多個)

  1. level: 記錄級別設定
  2. appender-ref: 指定參考的Appender設定

root logger 標籤:

為根記錄器,當其他記錄器執行完後最後會執行根記錄器(唯一)

 

如需要其他詳細說明,請參考官網的文件: http://logging.apache.org/log4net/release/manual/configuration.html

 

Step 2.

log4net.config 檔案完成後,就新加入一個 aspx 網頁來測試,

切換到後置程式碼畫面,首先必須 using log4net 的命名空間,

using log4net;
using log4net.Config;

在來取得 logger 物件,

private static readonly ILog TxtLog = LogManager.GetLogger(typeof(_Default));

接著指定使用的設定檔案,

XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("~/log4net.config")));

實際上完成大概如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net;
using log4net.Config;

public partial class _Default : System.Web.UI.Page
{

    private static readonly ILog TxtLog = LogManager.GetLogger(typeof(_Default));

    protected void Page_Load(object sender, EventArgs e)
    {
        XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("~/log4net.config")));
        TxtLog.Info("Page_Load_Start");

        TxtLog.Debug("Page_Load_Debug");

        TxtLog.Info("Page_Load_End");
    }
}

 

這時候只要執行本頁網頁之後就可以去找看看剛剛設定的路目底下有沒有log檔,

 

這邊的格式會依照你在 appender 標籤中設定的格式顯示,如此就完成文字檔記錄的使用。

 

二、寫入資料庫

Step 1.

寫入資料庫的設定方式也很簡單,首先在資料庫中建立一個 Log 資料表,

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
)
    

接下來開啟 log4net.config 設定檔,增加一組 appender 設定,

    <!-- 寫入資料庫設定開始 -->  
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="100" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TestDB.mdf;Integrated Security=True;User Instance=True" />
      <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>
    <!-- 寫入資料庫設定結束 -->

    <logger name="DBLog">
      <level value="ERROR" />
      <appender-ref ref="AdoNetAppender" />
    </logger>

 

說明:

  1. connectionString 要修改成你連結資料庫的連線字串,而 commandText 可以因應不同需求修改語法,在這邊以範例的Table為準。
  2. 多加入了一組 logger 取名為 DBLog,用來指定使用 AdoNetAppender

 

Step 2.

一樣回到後置程式碼的部分增加新的 logger,

    private static readonly ILog DBLog = LogManager.GetLogger("DBLog");

新增一個 Button Click 事件做為測試使用,

    protected void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            int num = Convert.ToInt32("123A");
        }
        catch (Exception ex)
        {
            DBLog.Error(ex.Message);
        }
    }

當發生 Exception 的時候,執行 DBLog.Error 的紀錄方式。

最後開啟網業測試並點擊按鈕後回到資料庫查看,

在回去看一下文字檔的LOG

 

經過以上的簡單設定,就可以在網站中加入執行紀錄,是不是很方便呢。

 

範例檔案


TLog4net.rar

 

參考資料


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

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)