先前用過 Enterprise Library 的 Logging 套件,後來嘗試用 NLog 搭配 ServiceStack Logging 套件,覺得易學易用,就一直這麼用了。我還喜歡 NLog 的獨立組態檔,不攪和 web.config/app.confg;將來若因為某些因素須棄 NLog 而改用其他 logging 套件,切換也很容易(ServiceStack 提供)。
安裝套件
使用 NuGet 把下圖中三個紅色框框標示的套件都裝了:
完成後,專案中除了加入必要的組件參考,專案根目錄下還會多出兩個檔案:NLog.config 和 NLog.xsd。其中 NLog.config 便是用來控制 NLog 的行為,其屬性「Copy to output directory」已自動設定為 "Copy always",亦即每次建置專案都會自動複製到建置輸出目錄。
組態檔
底下是 NLog.config 的一個簡單範例,程式輸出的 log 訊息會寫入至應用程式目錄下的 Logs 子目錄,而且以「一天」作為 archive 的時間單位,將過去的 log 歸檔至應用程式目錄的 Logs\Archives 子目錄下。
組態檔設定好之後,接著便可以在程式中輸出 log 訊息。
程式碼
首先,在應用程式初始化的地方建立 logger 工廠:
如果是 Web 應用程式,可將上述動作放在 Global.asax.cs 的 Application_Start() 方法中。Windows 應用程式可在主視窗的 Load 事件中處理。
往後每當需要輸出 log,就可以透過 ServiceStack 的 LogManager 取得 logger 物件,然後呼叫該物件的 Debug()、Info()、Warn()、Error()、Fatal() 等方法來輸出訊息。
範例:
如需格式化字串,也有 *Format() 方法可用,例如 DebugFormat()、InfoFormat()...等等。
安裝套件
使用 NuGet 把下圖中三個紅色框框標示的套件都裝了:
完成後,專案中除了加入必要的組件參考,專案根目錄下還會多出兩個檔案:NLog.config 和 NLog.xsd。其中 NLog.config 便是用來控制 NLog 的行為,其屬性「Copy to output directory」已自動設定為 "Copy always",亦即每次建置專案都會自動複製到建置輸出目錄。
組態檔
底下是 NLog.config 的一個簡單範例,程式輸出的 log 訊息會寫入至應用程式目錄下的 Logs 子目錄,而且以「一天」作為 archive 的時間單位,將過去的 log 歸檔至應用程式目錄的 Logs\Archives 子目錄下。
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--
See http://nlog-project.org/wiki/Configuration_file
for information on customizing logging rules and outputs.
-->
<targets>
<!-- add your targets here -->
<target name="file" xsi:type="File"
layout="${longdate} ${logger} ${message}"
fileName="${basedir}/logs/logfile.txt"
archiveFileName="${basedir}/logs/archives/log.{#}.txt"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="7"
concurrentWrites="true"
keepFileOpen="false"
encoding="iso-8859-2" />
<!--
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
-->
</targets>
<rules>
<!-- add your logging rules here -->
<logger name="*" minlevel="Info" writeTo="file" />
<!--
<logger name="*" minlevel="Trace" writeTo="f" />
-->
</rules>
</nlog>
組態檔設定好之後,接著便可以在程式中輸出 log 訊息。
程式碼
首先,在應用程式初始化的地方建立 logger 工廠:
ServiceStack.Logging.LogManager.LogFactory = new ServiceStack.Logging.NLogger.NLogFactory();
如果是 Web 應用程式,可將上述動作放在 Global.asax.cs 的 Application_Start() 方法中。Windows 應用程式可在主視窗的 Load 事件中處理。
往後每當需要輸出 log,就可以透過 ServiceStack 的 LogManager 取得 logger 物件,然後呼叫該物件的 Debug()、Info()、Warn()、Error()、Fatal() 等方法來輸出訊息。
範例:
using ServiceStack.Logging;
....
public class MyApiControllerBase : ApiController
{
protected ILog logger;
public MyApiControllerBase()
{
logger = LogManager.GetLogger(this.GetType());
}
public Foo()
{
logger.Info("Entering Foo().");
....
}
如需格式化字串,也有 *Format() 方法可用,例如 DebugFormat()、InfoFormat()...等等。

沒有留言: