NLog 組態檔範例:多重目標

貼一個 NLog 組態檔範例:多重輸出目標(文字檔 + Windows 事件日誌 + E-mail)。

這裡只提供一個簡單的組態檔範例,如需了解 NLog 的安裝與程式寫法,可參考文後的延伸閱讀清單(保哥和 mrkt 的文章)。

以下範例可以讓 NLog 同時輸出至文字檔和 Windows 事件日誌:
<?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>
    <!-- 輸出至檔案的設定 -->    
    <target name="file" xsi:type="File"
          layout="${longdate}|${level:uppercase=true}|${logger}|${message}"
          fileName="${basedir}/Logs/logfile.txt"
          archiveFileName="${basedir}/Logs/archives/log.{#}.txt"
          archiveEvery="Day"
          archiveNumbering="Rolling"
          maxArchiveFiles="7"
          concurrentWrites="true"
          keepFileOpen="false"
          encoding="UTF-8" />

    <!-- 輸出至 Windows 事件日誌 -->    
    <target name="eventLog" xsi:type="EventLog"
            layout="${longdate}|${level:uppercase=true}|${logger}|${message}"
            source="Huanlin Web Services"
            log="Application" />

    <!-- 寄送 e-mail 的設定 -->    
    <target name="mail" xsi:type="Mail"
            smtpServer="msa.hinet.net"
            smtpPort="25"
            smtpAuthentication="None"  <!-- 需要驗證帳密時改為 "Basic" --> 
            smtpUserName=""
            smtpPassword=""
            enableSsl="false"  <!-- 需要加密協定時改為 "true" -->
            from="XXX 網站系統&lt;username@mas.hinet.net&gt;"  <!-- Hinet 要求此帳戶必須是有效帳戶 --> 
            to="(收信人的 email,以逗號分隔多個信箱)"
            html="true"
            encoding="UTF-8"
            addNewLines="true"
            subject="系統訊息:${machinename} 於 ${shortdate} ${time} 產生 ${level} 等級的紀錄"
            header="========================================================================="
            body="${newline}
                    時間:${longdate} ${newline}${newline}
                    Log等級:${level:uppercase=true} ${newline}${newline}
                    Logger:${logger} ${newline}${newline}
                    Source:${callsite:className=true} ${newline}${newline}
                    Exception類別:${exception:format=type} ${newline}${newline}
                    錯誤訊息:${message} ${newline}${newline}"
            footer="========================================================================="
            />
  </targets>
  
  <!-- 以下區段決定哪些等級的 log 要輸出到哪裡 -->    
  <rules>
    <!-- add your logging rules here -->
    <logger name="*" minlevel="Debug" writeTo="file" />
    <logger name="*" minlevel="Warn" writeTo="eventLog" />
    <logger name="*" minlevel="Fatal" writeTo="mail" />
  </rules>
</nlog>
注意事項:如果在 ASP.NET 應用程式中使用上述設定,而實際查看 log 時,發現純文字的 log 檔案裡面有存入訊息,Windows 事件日誌卻完全沒有任何記錄,這可能是應用程式權限不足。此時可以試試開啟 IIS 管理員,把 ASP.NET 應用程式的 app pool 的 Identity 從預設的 ApplicationPoolIdentity 改成 LocalSystem。

將以上內容儲存成 NLog.config 並置於應用程式目錄下即可。或者利用 NuGet 安裝 NLog Configuration 套件,透過此套件來幫你在專案目錄下產生 NLog.config,再手動修改之。

欲了解上述範例的作用,可從底下的 rules 元素開始解讀,其中包含兩個 logger 元素:
  • 第一個 logger 元素的意思是將所有的 log 訊息(name="*")中,屬於 Debug 或 Debug 以上層級的 log 訊息(minLevel="Debug")輸出至名為 "file" 的目標(writeTo="file")。
  • 同理,第二個 logger 元素會將所有的屬於 Warn 或 Warn 以上層級的 log 訊息輸出至名為 "eventLog" 的目標。
  • 第三個 logger 元素會將所有 Fatal 層級的 log 訊息輸出至名為 "mail" 的目標,也就是當系統發生嚴重錯誤時,要寄送電子郵件給相關人等。這裡的範例是透過 Hinet 帳戶發信,其限制為電腦必須透過 Hinet 連上網路,好處則是不用驗證帳戶密碼(注意寄件人必須是有效的 Hinet email 信箱)。
這幾條 logger 規則都會被依序處理。也就是說,經過第一個 logger 處理過的訊息並不是就此扔掉,而是像接力賽跑那樣,把 log 訊息接著交給下一個 logger 處理(亦可利用 final="true" 來停止處理後續規則)。此外,除了可以用 minLevel 屬性來控制 logger 所要處理的最低記錄層級,也可以用另一個 levels 屬性來明確指定一或多種層級。(點我查看官方文件

下圖是輸出至 Windows 事件日誌的樣子:

傳送至 e-mail 的結果:

接著再來看「輸出目標」,也就是 target 元素。此元素除了指定 log 訊息要輸出到哪裡(輸出類型),還可以指定訊息的輸出格式。這裡簡要說明兩個基本屬性的用途:
  • name 屬性:可讓我們為每一個輸出目標取個識別名稱,以便在設定規則時,能夠由 logger 元素的 writeTo 屬性來控制要輸出至哪個或哪些目標(以逗號來分隔多個目標,例如 writeTo="file,eventLog")。
  • xsi:type 屬性:用來指定輸出目標的類型。

NLog 支援的目標類型超過二十種,而且各種目標又有各自不同的屬性。詳細用法還是看官方文件吧:NLog Configuration File

延伸閱讀
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor