log4net - .Net專用紀錄Log的函式庫

Log,是紀錄系統狀態與事件的一種機制,可以協助開發人員找出程式問題,或幫助維運人員監控系統狀態,所以Log是開發一套系統不可或缺的一部份。通常Log最簡單的方式就是直接利用程式碼指令將訊息印出來或者寫出檔案。複雜一點的話可將Log模組化,讓Log模組自動運行紀錄系統訊息。Apache Logging Services提供開發人員一套Log的Library,log4N。這套Library讓開發人員不用花時間開發Log模組也能使用不會太簡單又不會太複雜的Log模組。這次就來看看.Net專用的log4N,log4net。



log4net的N其實代表的是程式語言,因為Apache Logging Services為許多程式語言提供Log的Library,有.Net, Java, PHP, Cxx...等,雖然語言不同,但使用的是同一種機制。

log4net主要由三個部分組成:
  • LoggerLog的實體。開發人員取得Logger便可以透過呼叫Logger的各種Level的方法寫入Log。
  • Appender即為Log輸出的目標。Appender接收到Logger的訊息,將訊息進行處理後輸出到目標位置,目標位置可為資料庫, Console, 檔案...等。
  • LayoutLog訊息的輸出格式,開發人員設定好Layout後,Appender會依據Layout的格式將Log訊息格式化後輸出至目標位置。

Logger

Logger為log4net的主要核心,透過呼叫GetLogger的方法可以取得Logger的Instance,取得Instance後就可以呼叫Info, Debug, Warn, Error, Fatal方法來記錄各種層級的訊息。Log的層級由小到大依序為 Info < Debug < Warn < Error < Fatal,層級愈高代表訊息更重要。在取得Logger Instance之後要先載入設定才能使用,最簡單的方式就是使用BasicConfigurator.Configure()方法載入最基本的設定,用這個只能在Console印出訊息。如果要載入App.config或Web.config的設定時,就要使用XmlConfigurator.Configure(),這樣就可以載入在設定檔中各種設定,例如Appender的設定, Layout的設定...等。

Appender

如果說Logger是核心的話,那Appender可以說是真正執行的工具,Logger決定由哪個Appender來寫訊息。Appender決定寫出訊息的目標位置, 輸出色彩...等。log4net預設提供了許多種類型的Appender,當然,如果覺得不適合的話也可以自己客製化一個Appender,以下限量列出幾個特別的Appender的功能:

  • ColorConsoleAppender:輸出至Console,可以設定訊息文字的顏色或背景顏色。
  • FileAppender:輸出至檔案,將訊寫寫至本機端的檔案裡。
  • RollingFileAppender:FileAppender的進階版,可以根據自訂規則寫出多個檔案。
  • EventLogAppender:輸出至Windows Event Log,可以在Windows的事件檢視器上檢視。
  • SmtpAppender:輸出至Email,輸出的訊息會發送至指定的Email。
  • AdoNetAppender:輸出至資料庫,透過ADO.NET定義資料庫Table將訊息寫入資料庫。

...

Layout

Layout是屬於比較靜態的設定,他只負責決定訊息的格式,使用者可以客製化訊息格式,例如加入時間, Thread編號, 序號...等資訊。log4net也提供了幾種Layout的Pattern,例如:

  • PatternLayout:提供使用者可客製化的格式,使用方式類似C語言printf方法一樣,%表示參數名稱,例如:%level %thread %logger - %message%newline,PatternLayout為較常用的格式。
  • SimpleLayout:提供簡單的訊息格式([level] - [message])。
  • XmlLayout:將訊息轉換為XML格式,含有Logger相關資訊。

...

大概介紹完後,接下來就是簡單使用一樣,限量在範例中同時要寫出Console和File,所以用ConsoleAppender和RollingFileAppender。

範例程式碼:

Program.cs


using System;
using log4net;
using log4net.Config;

namespace Log4netTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // 取得Logger(Logger以Program的Type Name命名)
            var log = LogManager.GetLogger(typeof(Program));

            //BasicConfigurator.Configure();
            // 因為要讀取從App.config讀取設定,所以使用XmlConfigurator
            XmlConfigurator.Configure();
            for (var i = 0; i < 10; i++)
            {
                log.Info(i);
                log.Debug(i);
            }

            Console.ReadLine();
        }
    }
}



App.config


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!--要引用log4net 相關ConfigurationSection-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
        <!--訊息格式 EX: 2016-03-01 18:15:59,912 [10] INFO  Log4netTest.Program - 9--> 
        <conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--檔名設定為example.log-->
      <file value="example.log" />
      <appendToFile value="true" />
      <!--檔案最大容量-->
      <maximumFileSize value="100KB" />
      <layout type="log4net.Layout.PatternLayout">
        <!--印出 日期 Thread編號 層級 Logger名稱 訊息-->
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <!--Level為INFO的Log才會寫出-->
      <level value="INFO" />
      <!--印到Console上-->
      <appender-ref ref="ConsoleAppender" />
      <!--寫出至檔案-->
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</configuration>

執行結果:


Console輸出


檔案輸出


看完了基本使用後,就可以在專案上套用基本的Log模組。當然,log4net還有許多更進階的用法,例如:客製化Appender。這就等限量遇到的時候再來分享吧。



參考來源:
Apache Logging Services - Apache log4net









留言