ServiceStack Logging with NLog

先前用過 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 子目錄下。

<?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()...等等。

沒有留言:

技術提供:Blogger.
回頂端⬆️