不論開發哪種類型的程式,大都會有紀錄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的功能了。