C# NLog 套件的設定

January 22, 2024

NLog 是一套 Open Source 的 Log 工具,支援多種 .Net 平台,使用上簡單又具備調整的彈性。

可以跟著 NLog 官網教學安裝。安裝好 NLog 後,可以藉由調整 nlog.config 來調整 Log 的格式。以下介紹 nlog.config 檔案的常用設定值 (也可直接查詢 Configuration file · NLog/NLog Wiki)。

Target 功能

指定訊息要輸出的目標,常用的 target 如下:

Target 描述
Console 顯示在命令列上
File  寫入文字檔案
MailKit  寄送 SMTP 郵件訊息
Memory 存放訊息在 ArrayList

Rule 功能

Rule 功能可以限制不同等級的訊息輸出到特定的目標 (Target) ,如檔案或網路位址。

部分會用到的 Rule 元素如下:

元素 說明
name  要記錄的類別名稱,可接受萬用字元 * 和 ?
minlevel  要記錄的最小等級
maxlevel  要記錄的最大等級
writeTo 要寫入的 Target
final (此類別) 最後適用的規則,列在後方的不處理
finalMinLevel (此類別) 只記錄該等級以上的訊息
適用於 NLog 5.0 和之後的版本,請參考:Logging Rules FinalMinLevel · NLog/NLog Wiki · GitHub  

Layout 功能

Layout 功能是依照特定標籤和格式顯示 Log,標籤可稱為 Layout Renderer,包含多種實用的除錯內容。

部分會使用到的 Layout 標籤如下:

標籤 描述 連結
aspnet-request-url
顯示需求的 URL,預設顯示 Scheme, Host 和 Path,可另外顯示 Port 和 Query String AspNetRequest Url Layout Renderer · NLog/NLog Wiki · GitHub
activity
.NET 分散式追蹤的列舉,可以加入 property=TraceId 顯示個別 API 請求的 Trace ID GitHub - NLog/NLog.DiagnosticSource
level 訊息等級 Level layout renderer · NLog/NLog Wiki · GitHub
longtime 以 yyyy-MM-dd HH:mm:ss.ffff 格式顯示時間 Longdate Layout Renderer · NLog/NLog Wiki · GitHub
message 訊息內容 Message Layout Renderer · NLog/NLog Wiki · GitHub
pad
顯示時內容固定寬度,不足時以空格補充 Pad Layout Renderer · NLog/NLog Wiki · GitHub
replace-newlines
取代換行字元,預設為空白 Replace NewLines Layout Renderer · NLog/NLog Wiki · GitHub
truncate
內容超過指定長度時,截斷後方內容 I want to truncate message layout renderer after 30 characters in database logging.Any suggestion? · Issue #3040 · NLog/NLog · GitHub

詳細列表可以參考:Layout Renderers - Config - NLog

Log 等級

NLog 的 Log 等級可以分成以下幾種,順序越大表示嚴重性越高:

等級 順序 說明
Trace 0 通常用在開發程式的觀察
Debug 1 用於除錯想檢查的部分
Info 2 標示出應用程式的重要事件
Warn 3 警告驗證問題或是可被還原的暫時性錯誤
Error 4 例外發生或功能失效
Fatal 5 最嚴重等級,應用程式將要停止運作

加入 Trace ID

若想加入每個 API 請求的 Trace ID,以增加除錯的觀察性,可以安裝 NLog.DiagnosticSource  套件:GitHub - NLog/NLog.DiagnosticSource 。這個套件是 Microsoft Activity Trace (.NET 分散式追蹤) 的 NLog Layout Renderer。

可以透過 NuGet 管理員安裝套件,並在 nlog.config 內加入:

<extensions>
    <add assembly="NLog.DiagnosticSource"/>
</extensions>

即安裝完成。接著在 nlog.config 的 Layout 內增加 activity:property=TraceId 屬性,例如:

<target xsi:type="File" name="web" fileName="${shortdate}.log"
  layout="${time}-[${level}]-[${activity:property=TraceId:truncate=6}]-${replace-newlines:${message}} ${exception:format=tostring}" />

File Target

如果要將 Log 寫在檔案內,可以設定 File Target 達到這個目標。

請參考以下的 File Target:

<target name="file" 
xsi:type="File" 
keepFileOpen="true"
layout="${time}-[${level}]-[${activity:property=TraceId:truncate=6}]-${replace-newlines:${message}} ${exception:format=tostring}"
fileName="Path/${machinename}-${shortdate}.txt"
encoding="UTF-8"/> 

常用的參數說明如下:

參數 說明
keepFileOpen 保持檔案開啟
fileName 檔案存放路徑與名稱,可以套用 Layout 內的標籤
encoding 要使用的編碼

如果要定期刪除 Log,避免佔用過多磁碟空間的話,要啟用歸檔的相關設定。歸檔功能可以幫你依照條件刪除過久的 Log,但建議被歸檔的 Log 路徑不啟用動態的 Layout 標籤,避免歸檔失敗。

範例如下:

<target name="file" xsi:type="File" keepFileOpen="true"
	layout="${time}-[${level}]-[${activity:property=TraceId:truncate=6}]-${replace-newlines:${message}} ${exception:format=tostring}"
	fileName="Path/CurrentLog.txt"
	archiveFileName="Path/ArchiveLog.{#}.txt"
	archiveEvery="Hour"
	maxArchiveFiles="24"
	encoding="UTF-8" />

常用的參數說明如下:

參數 說明
archiveFileName 要歸檔的檔案路徑與名稱
archiveEvery 多久要進行歸檔
maxArchiveFiles 最多保留的歸檔 Log 檔,超過時由最舊的開始刪除

archiveEvery 可以填入以下的單位:

單位 說明
Day 每天歸檔
Hour 每小時歸檔
Minute 每分鐘歸檔
Month 每個月歸檔
Year 每年歸檔

請參考:

Memory Target

Memory Target 適用於應用程式內取得寫入的訊息紀錄,因為存取 File Target 時,可能會遇到 NLog 正在占用的情形,可參考:NLog get log message in c# - Stack Overflow

綜合參考資料

基礎介紹與安裝:.NET Core - 使用 NLog 紀錄日誌資訊 - Tim Chen’s Blog