貼一個 NLog 組態檔範例:多重輸出目標(文字檔 + Windows 事件日誌 + E-mail)。
這裡只提供一個簡單的組態檔範例,如需了解 NLog 的安裝與程式寫法,可參考文後的延伸閱讀清單(保哥和 mrkt 的文章)。
以下範例可以讓 NLog 同時輸出至文字檔和 Windows 事件日誌:
將以上內容儲存成 NLog.config 並置於應用程式目錄下即可。或者利用 NuGet 安裝 NLog Configuration 套件,透過此套件來幫你在專案目錄下產生 NLog.config,再手動修改之。
欲了解上述範例的作用,可從底下的 rules 元素開始解讀,其中包含兩個 logger 元素:
下圖是輸出至 Windows 事件日誌的樣子:
傳送至 e-mail 的結果:
接著再來看「輸出目標」,也就是 target 元素。此元素除了指定 log 訊息要輸出到哪裡(輸出類型),還可以指定訊息的輸出格式。這裡簡要說明兩個基本屬性的用途:
NLog 支援的目標類型超過二十種,而且各種目標又有各自不同的屬性。詳細用法還是看官方文件吧:NLog Configuration File。
延伸閱讀
這裡只提供一個簡單的組態檔範例,如需了解 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 網站系統<username@mas.hinet.net>" <!-- 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 信箱)。
下圖是輸出至 Windows 事件日誌的樣子:
傳送至 e-mail 的結果:
接著再來看「輸出目標」,也就是 target 元素。此元素除了指定 log 訊息要輸出到哪裡(輸出類型),還可以指定訊息的輸出格式。這裡簡要說明兩個基本屬性的用途:
- name 屬性:可讓我們為每一個輸出目標取個識別名稱,以便在設定規則時,能夠由 logger 元素的 writeTo 屬性來控制要輸出至哪個或哪些目標(以逗號來分隔多個目標,例如 writeTo="file,eventLog")。
- xsi:type 屬性:用來指定輸出目標的類型。
NLog 支援的目標類型超過二十種,而且各種目標又有各自不同的屬性。詳細用法還是看官方文件吧:NLog Configuration File。
延伸閱讀
- 介紹好用函式庫:NLog - Advanced .NET Logging by 保哥
- 使用NLog - Advanced .NET Logging (1) by mrkt
- 使用NLog - Advanced .NET Logging (5) by mrkt (這篇詳細說明了寄送 e-mail 的設定方法與注意事項)
- Comparison of .NET Logging Frameworks and Libraries
- Logging setup in 5 minutes with NLog
- Sentinel (這是個 log 檢視工具,支援 NLog 和 Log4Net)
- Harvester (也是 log 檢視工具,支援 NLog 和 Log4Net)
沒有留言: