.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:logISPinternal-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:logISP
log-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:logISP
log-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

原文地址:https://www.cnblogs.com/PrintY/p/13513239.html