在ASP.NET Core API 專案中使用NLog將Log寫入檔案

Visual 版本 : 2017
.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設定


我們先將28 29 與38行移出註解區域,這樣子才能進行測試,先介紹Target與Rule兩大設定,他們彼此之間是相關聯的


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

LevelTypical 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中


參考文章

https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2


留言

這個網誌中的熱門文章

CPE 一顆星選集題目說明與解答 - Java 筆記與心得分享

Visual Studio 自動排版格式化程式碼

1. Vito's family (CPE10406, UVA10041) - CPE一顆星解答與說明