[DotNet套件] Common.Logging

不論開發哪種類型的程式,大都會有紀錄Log的需求,來協助我們來了解程式的運作情形。但市面上有許許多多的Log套件,如:log4net、Nlog...等,每套都有自己的使用方法。所以當我們有需求要轉換Log套件時,變成我們要去變更程式中所有使用Log的程式碼,光想就覺得是件大工程!

Common.Logging就是將這些套件使用方式抽象化出一個共通的Interface,所以程式碼中呼叫的都是Interface的方法。因此,不論我們底層是使用哪個Log套件,程式碼都是一樣的。當我們有變更Log套件的需求時,我們也只要變更設定檔的設定即可。

套件安裝

要安裝Common.Logging非常容易,直接利用Nuget來安裝即可

套件設定

有兩個地方能設定Common.Logging的參數:設定檔及程式碼,下面我用在Console程式顯示Log來當作示範。

設定檔:

先打開專案的App.config檔案,分別增加SectionGroup及對應的設定片段,如下所示

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
    </sectionGroup>
  </configSections>

  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
        <arg key="level" value="INFO" />
        <arg key="showLogName" value="true" />
        <arg key="showDateTime" value="true" />
        <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:fff" />
      </factoryAdapter>
    </logging>
  </common>

</configuration>

程式碼:

利用NameValueCollection去設定Common.Logging的參數,另外ConsoleOutLoggerFactoryAdapter也有無參數建構子,代表Common.Logging是使用預設參數。

NameValueCollection properties = new NameValueCollection();
properties["dateTimeFormat"] = "yyyy/MM/dd HH:mm:ss";

LogManager.Adapter = new ConsoleOutLoggerFactoryAdapter(properties);

使用方法

Common.Logging的用法與log4net非常接近,都是利用LogManager來產生log物件,接著再使用log物件的方法來記錄。

ILog log = LogManager.GetLogger<Program>();
log.Info("Start");

Common.Logging的等級共有六個層級,緊急程度由低至高:Trace、Debug、Info、Warn、Error、Fatal

心得

Common.Logging提供了一個介面讓程式碼與Log套件達到鬆散耦合,不過也就代表當有需求要在程式執行時動態調整Log參數時,必須還是要就該Log套件來撰寫程式碼,如此一來也就失去Common.Logging的功能了。

參考資料

Common Infrastructure Libraries for .NET

Common Logging Github