1、添加NuGet
NLog.Web.AspNetCore
2、Program.cs 注入, UseNLog()
1 public static IHostBuilder CreateHostBuilder(string[] args) => 2 Host.CreateDefaultBuilder(args) 3 .ConfigureWebHostDefaults(webBuilder => 4 { 5 webBuilder.UseStartup<Startup>(); 6 }).UseNLog();// 添加這句 注入nlog;
3、創建nlog.config
PS:這個是比較簡單的版本,更復雜的信息大家自己研究
1 <?xml version="1.0" encoding="utf-8"?> 2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="Info"> 3 <!-- 啟用.net core的核心布局渲染器 --> 4 <extensions> 5 <add assembly="NLog.Web.AspNetCore" /> 6 </extensions> 7 <!-- 寫入日志的目標配置 --> 8 <targets> 9 <!-- 調試 --> 10 <target xsi:type="File" name="debug" fileName="logs/debug-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> 11 <!-- 警告 --> 12 <target xsi:type="File" name="warn" fileName="logs/warn-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> 13 <!-- 錯誤 --> 14 <target xsi:type="File" name="error" fileName="logs/error-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" /> 15 </targets> 16 <!-- 映射規則 --> 17 <rules> 18 <!-- 調試 --> 19 <logger name="*" minlevel="Trace" maxlevel="Debug" writeTo="debug" /> 20 <!--跳過不重要的微軟日志--> 21 <logger name="Microsoft.*" maxlevel="Info" final="true" /> 22 <!-- 警告 --> 23 <logger name="*" minlevel="Info" maxlevel="Warn" writeTo="warn" /> 24 <!-- 錯誤 --> 25 <logger name="*" minlevel="Error" maxlevel="Fatal" writeTo="error" /> 26 </rules> 27 </nlog>
4、使用
1 public NLog.Logger log = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger(); 2 3 log.Info("這是一個Info"); 4 log.Error(new Exception(), "這是一個Exception"); 5 log.Debug("這是一個Debug");
此處說明下,參考其他的示例,在控制器中有通過構造函數方式注入的,如下所示:
1 /// <summary> 2 ///用戶信息 3 ///Print.Y 4 /// </summary> 5 [Route("api/[controller]/[action]")] 6 [ApiController] 7 public class UserController : BaseController 8 { 9 /// <summary> 10 /// 日志 11 /// </summary> 12 private readonly ILogger<UserController> _logger; 13 14 /// <summary> 15 /// 構造函數 16 /// </summary> 17 /// <param name="logger"></param> 18 public UserController(ILogger<UserController> logger) 19 { 20 _logger = logger; 21 } 22 }
但是在使用的時候我發現,通過這種方式注入的,使用的是“Microsoft.Extensions.Logging”,並不是NLog,在使用上有個小問題:
大家可以看到,並不能直接記錄Exception ,因為沒有一個參數且類型為“Exception”的重載,當然可以通過封裝來實現,這里就不杠了... 個人比較喜歡用最上面的方式來進行nlog對象的實例化,然后進行使用。
5、日志目錄
根據config中的配置,不同等級的信息存在不同的.log文件中,打開一個異常日志內容如下:
信息顯示還是比較全的,異常信息內容以及異常所在的controller action 以及行數都明確顯示。
PS:當前文章我是參考了很多網上的資料,然后進行學習和總結,最后和大家分享,如果有錯誤的地方還請批評指正。
上面的Nlog配置文件放在webapi項目中,會有點問題,比較推薦下面這個配置:

1 <?xml version="1.0" encoding="utf-8" ?> 2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 autoReload="true" 5 throwConfigExceptions="true" 6 internalLogLevel="info" 7 internalLogFile="E:\log\ISP\internal-nlog.txt"> 8 <!--autoReload:修改后自動加載--> 9 <!--throwConfigExceptions:NLog日志系統拋出異常--> 10 <!--internalLogLevel:內部日志的級別--> 11 <!--internalLogFile:內部日志保存路徑,日志的內容大概就是NLog的版本信息,配置文件的地址等等--> 12 13 <!-- the targets to write to --> 14 <!--輸出日志的配置,用於rules讀取--> 15 <targets> 16 <!-- 將日志寫入文件中 --> 17 <target xsi:type="File" name="allfile" fileName="E:\log\ISP\nlog-all-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" /> 18 <!--同樣是將文件寫入日志中,寫入的內容有所差別,差別在layout屬性中體現。寫入日志的數量有差別,差別在路由邏輯中體現--> 19 <target xsi:type="File" name="ownFile-web" fileName="E:\log\ISP\nlog-own-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" /> 20 </targets> 21 22 <!-- rules to map from logger name to target --> 23 <rules> 24 <!--路由順序會對日志打印產生影響。路由匹配邏輯為順序匹配。--> 25 <!--All logs, including from Microsoft--> 26 <logger name="*" minlevel="Trace" writeTo="allfile" /> 27 <!--Skip non-critical Microsoft logs and so log only own logs--> 28 <!--以Microsoft打頭的日志將進入此路由,由於此路由沒有writeTi屬性,所有會被忽略--> 29 <!--且此路由設置了final,所以當此路由被匹配到時。不會再匹配此路由下面的路由。未匹配到此路由時才會繼續匹配下一個路由--> 30 <logger name="Microsoft.*" maxlevel="Info" final="true" /> 31 <!-- BlackHole --> 32 <!--上方已經過濾了所有Microsoft.*的日志,所以此處的日志只會打印除Microsoft.*外的日志--> 33 <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> 34 </rules> 35 </nlog>
感謝:
https://www.cnblogs.com/fancyblogs/p/12924263.html