.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项目中,会有点问题,比较推荐下面这个配置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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