在ASP.NET Core API 專案中使用NLog將Log寫入檔案
Visual 版本 : 2017
.NET Code 版本 : 2.2
操作目標 : 將Log寫入檔案與顯示在偵錯的輸出視窗
我們先將28 29 與38行移出註解區域,這樣子才能進行測試,先介紹Target與Rule兩大設定,他們彼此之間是相關聯的
步驟1:新增target
.NET Code 版本 : 2.2
操作目標 : 將Log寫入檔案與顯示在偵錯的輸出視窗
新增ASP.NET Core API專案
使用Nuget安裝NLog相關套件
1.NLog.Web.AspNetCore
2.NLog
新增NLog.config設定檔
新增方式有兩種:
1.手動自己新增檔案
2.安裝套件NLog.config自動產生檔案
第2種方法發現有個奇怪的地方
自動建立的NLog.config檔案並不會建立在專案目錄下
而是建立在其他目錄中
若您有新增多個專案,皆有安裝此套件
那在編輯NLog.config檔案時,其實會修改到其它的專案設定
因為這些專案參考的都是同一個檔案
且無法更改檔案名稱,覺得蠻奇怪的,
所以我的方法是,安裝完把設定檔另外複製下來貼到專案下,再把此套件移除XD
設定NLog.config屬性
若透過自行產生檔案的方式,請記得將NLog.config的 複製到輸出目錄 修改為 永遠複製
若忽略此步驟,後續整個專案會遇到 HTTP Error 500.30 - ANCM In-Process Start Failure 錯誤而無法執行
調整NLog.config的targets與rules設定
Target
預設的設定中,有一個名稱為f 並使用寫入檔案的方式來記錄log
有兩個重要屬性
1. xsi:type
這邊可以設定要將Log記錄在哪邊,例如寫入檔案、顯示在Debug的輸入視窗或者是寫入資料庫等等
2. name
這邊是一個具有辨識的唯一值,等一下會在Rule中使用到
其它屬性
fileName:定義寫入的檔案名稱,將以日期為檔名
layout: Log輸出的格式
相關參數的使用可參考這邊
https://nlog-project.org/config/?tab=layout-renderers
Rule
預設設定中,將會記錄Debug Level以上的紀錄,並且以 f (target的name值) 的方式進行log的儲存
Level介紹
等級由高至低為 Fatal > Error > Warn > Info > Debug > Trace
若Rule的 minlevel 設定為 Debug 那Log 只會記錄 Fatal/Error/Warn/Info/Debug
Level | Typical Use |
---|---|
Fatal | 有嚴重錯誤發生,應用程式可能將無法運作 |
Error | 有預期或非預期的錯誤發生,可能會造成某些功能無法運作 |
Warn | 警告訊息,不理會無大礙,但若有時間還是建議解決相關問題 |
Info | 基本的運作資訊 |
Debug | 抓問題時,方便除錯 |
Trace | 開發期間使用 |
設定Program.cs
開啟Program.cs檔案,在Main方法中加入
NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
並using NLog.Web
再透過UseNLog()來明確指定我們要使用NLog來紀錄Log
另外.net core的DI已經含有Logger 物件,所以這邊就不需要再做額外的Logger DI設定
輸出Log事件
開啟ValuesContorller,
在建構子注入ILogger,然後於Get方法中輸出Log
偵錯專案
使用瀏覽器開啟 http://專案網址/api/values
查看Log
專案目錄\bin\Debug\netcoreapp2.2\logs
透過以下兩張圖
我們就可以確認Log是參照Target的設定格式儲存的
<target
xsi:type="File"
name="f"
fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}"
/>
由下圖可以看到紅色框框內是由ValuesController中的Get方法所產生的
其中並沒有看到Trace的事件
是因為Rule中我們只記錄了Debug level以上的log, 所以Trace就被忽略了
<logger name="*" minlevel="Warn" writeTo="f" />
補充
Target與Rule是多對多的關係
我們除了可以將log寫入檔案,也可以將log以其它方式進行處理
例如我們可同時將Log寫入檔案,也可以同時顯示在偵錯的輸出視窗中
步驟1:新增target
<target
name="c"
xsi:type="OutputDebugString"
layout="${longdate} ${uppercase:${level}} ${message}"
/>
步驟2:將上述的target放置到rule中
步驟2:將上述的target放置到rule中
參考文章
https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2
留言
張貼留言