zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/PrintY/p/13513239.html
Copyright © 2011-2022 走看看