.net core 3.1 使用nlog進行日志記錄


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>
View Code

 

 

感謝:

https://www.cnblogs.com/fancyblogs/p/12924263.html

https://blog.csdn.net/fqydhk/article/details/104724445

https://www.cnblogs.com/Kevin-Ni/p/9995894.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM