Nlog 變數宣告與使用

一直以來只使用 Nlog 來寫 log 與寫 db 記錄,卻沒有使用到 nlog 的變數與 if/else 來進行更進階的運用

最常用的 layout render 如 basedir, shortdate...etc 可參考完整列表

今天遇到一個需求是要把 ${basedir} 的環境變數用 applicatoin setting 裡設定的值來取代

這時候我們可以用這樣的方式來讀取 application setting 的值並 assign 給 nlog 的變數

<variable name="NLogBasePathVar" value="${appsetting:item=NLogBasePath}}"/>

在 web.config 裡設定了這個變數對應的值

<add key="NLogBasePath" value="D:/" />

在 target 端我們就可以把 basedir 這裡的路徑 取代成 NLogBasePathVar(讀取  application setting裡的路徑)

 <target name="InOutLog" xsi:type="File"
            fileName="${basedir}/App_Data/Logs/${shortdate}/log.txt"
            layout="${longdate} | ${level:uppercase=true} | ${logger:shortName=true} | ${message} ${newline}" encoding="utf-8" keepFileOpen="false" />


            
為了練習條件式的 nlog 變數宣告方式(?)

所以我們創造了一個需求是這樣的,如果 appsetting 若是忘了維護上去的話就要改抓 ${basedir}

需注意的是basedir 由於是環境變數,已經在 $ 之內使用了,故不需再加上$,如下所示{appsetting:item=NLogBasePath:default=${basedir}}

<variable name="NLogBasePathVar" value="${appsetting:item=NLogBasePath:default=basedir}"/>

但如果今天default 後面所定義的值不是環境變數的話,則會是一個字串輸出,如下例 NLogBasePathVar = xxxbasedir(字串)

<variable name="NLogBasePathVar" value="${appsetting:item=NLogBasePath:default=xxxbasedir}"/>

Target 的部份不需變動 

若要有完整的練習感,則可用下例Nlog 官方所提供的句法來進行

<variable name="NLogBasePathVar" value="${when:when=length('${appsetting:item=NLogBasePath}')==0: inner=${basedir}: else= ${appsetting:item=NLogBasePath}}"/>

由於這種寫法跟 C# 的寫法還是有點不同,在 debug 上也不是那麼直覺

若需要 debug 可以參考之前 NLog 基本介紹與偵錯 這裡的資料

亦或是將 variable 的資料當成資料寫至 text file 裡的 layout 欄位也是一種可視覺化除錯的方式

<target name="InOutLog" xsi:type="File"
            fileName="${basedir}/App_Data/Logs/${shortdate}/log.txt"
            layout="${NLogBasePathVar} ${longdate} | ${level:uppercase=true} | ${logger:shortName=true} | ${message} ${newline}" encoding="utf-8" keepFileOpen="false" />


參考資料
https://github.com/NLog/NLog/wiki/AppSetting-Layout-Renderer
https://github.com/nlog/NLog/wiki/Configuration-file#variables
https://nlog-project.org/config/?tab=layout-renderer
s