Asp.NetCore Web開發之Nlog日誌配置
接著講基於ASP.net Core 的web開發,這節主要講一下如何使用和配置Nlog進行日誌記錄。
日誌在開發中的作用是很重要的,使用日誌,程式出了錯誤可以及時捕獲並記錄下來,開發人員可以通過日誌定位錯誤,進行修復。
ASP.net Core雖然也給我們提供了一個原生的日誌系統,但是這個日誌系統不夠強大,不能滿足我們的一些需求,我們可以使用第三方的日誌庫,比較優秀的就是Nlog,使用它,我們首先要安裝這個包,開啟Nuget包管理器(瞭解詳細的安裝程式包請點選.Net Core平臺下,新增包的引用),搜尋:NLog.Web.AspNetCore將其下載安裝。
安裝完成後,需要新增一個Nlog的xml配置文件:右鍵解決方案名,新增新項,如下圖:
名字最好和圖片一樣,建立完成以後,將下方的配置程式碼複製到配置檔案中:
<?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"> <targets> <target xsi:type="File" name="logfile" fileName="${basedir}/logs/${shortdate}.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True} |${uppercase:${level}}|${message} ${exception}" /> <target xsi:type="File" name="debugfile" fileName="${basedir}/logs/${shortdate}_debug.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True} |${uppercase:${level}}|${message} ${exception}" /> <target xsi:type="File" name="errfile" fileName="${basedir}/logs/${shortdate}_error.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True} |${uppercase:${level}}|${message} ${exception}" /> </targets> <rules> <logger name="*" level="Debug" writeTo="debugfile" /> <logger name="*" level="Error" writeTo="errfile" /> <logger name="*" minlevel="Trace" writeTo="logfile" /> </rules> </nlog>
這個配置檔案主要是配置日誌規則,和存放日誌檔案的路徑,有興趣的同學可以去Nlog官網看一下配置檔案的所有規則。
注意,配置檔案還有很重要的一步,右鍵配置檔案點選屬性:
將複製到輸入目錄設定為總是複製:
這樣,當你執行或者打包程式的時候,這個日誌配置檔案也會被打包在內。
接下來,我們要在Program.cs檔案中配置使用Nlog,這個方法是用Nlog替代ASP.NetCore 自帶的日誌系統,也可以在Startup.cs中配置Nlog日誌服務,兩個方法都可以,先講一下前者:
在Main方法的生成主機方法之前加入:
//配置Nlog NLogBuilder.ConfigureNLog("Nlog.config");
這一步是載入配置檔案,然後在CreateHostBuilder中新增幾行配置:
.ConfigureLogging(l => { //移除其餘的Logger l.ClearProviders(); //設定最低日誌等級 l.SetMinimumLevel(LogLevel.Information); //每次記錄日誌,都顯示到控制檯 l.AddConsole(); }).UseNLog()//使用Nlog
最終配置如下圖:
這樣,我們就可以使用Nlog記錄日誌了:
執行一遍以後,會在執行目錄下生成log資料夾,和兩個日誌檔案(路徑可以在配置檔案中修改):
接下來講一下第二種方法,註冊Nlog日誌服務,首先在appsetting.json中新增如下配置:
"NLog": { "autoReload": true, "throwConfigExceptions": true, "internalLogLevel": "info", "internalLogFile": "${basedir}/logs/internal-nlog.txt", "extensions": { "NLog.Extensions.Logging": { "assembly": "NLog.Extensions.Logging" } }, "variables": { "var_logdir": "${basedir}" }, "default-wrapper": { "type": "AsyncWrapper", "overflowAction": "Block" }, "targets": { "all-file": { "type": "File", "fileName": "${var_logdir}/logs/nlog-all-${shortdate}.log", "layout": { "type": "JsonLayout", "Attributes": [ { "name": "time", "layout": "${longdate}" }, { "name": "level", "layout": "${level}" }, { "name": "target", "layout": "${callsite:className=true:methodName=true:skipFrames=1}" }, { "name": "message", "layout": "${message:raw=true}", "escapeUnicode": "false" }, { "name": "properties", "encode": "false", "layout": { "type": "JsonLayout", "includeallproperties": "true" } } ] } }, "own-console": { "type": "LimitingWrapper", "interval": "00:00:01", "messageLimit": 100, "target": { "type": "Console", "layout": "${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|${callsite}" } } }, "rules": [ { "logger": "*", "minLevel": "Trace", "writeTo": "all-file" }, { "logger": "Microsoft.*", "maxLevel": "Info", "final": true }, { "logger": "*", "minLevel": "Debug", "writeTo": "own-console", "filters": { "whenRepeated": { "layout": "${message}", "action": "Ignore" } } } ] }
這個跟Nlog.config作用是一樣的,然後在ConfigServices中註冊服務:
//讀取配置檔案 LogManager.Configuration= new NLogLoggingConfiguration(Configuration.GetSection("NLog")); var currentClassLogger = NLog.Web.NLogBuilder.ConfigureNLog(LogManager.Configuration).GetCurrentClassLogger(); services.AddSingleton<Logger>(currentClassLogger);
然後在需要的地方正常新增依賴注入(NLog.Logger類):
這裡要說明一點,通過這個方式配置的Nlog,是不會覆蓋自帶的日誌系統的,如果要取消,可以在CreateHostBuilder中配置,怎麼移除上方有講。
記錄日誌的方式如下:
_nlogger.Properties.Clear(); _nlogger.Error("Read once Data");
因為每次記錄日誌都會將屬性值連帶記錄,它的屬性值又是共有的,不清除的話,會有上次記錄的冗餘資料,這個當然是不友好的,所以要先清除,如果要記錄額外資料的話,就可以為屬性值賦值,它是一個鍵值對集合。
這是我的公眾號二維碼,獲取最新文章,請關注此號