.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

背景

.net core 中已经集成了log的方法, 但是只能控制台输出不能写入文件等等. 常见第三方的的日志工具包括log4net, nlog等等, 本文介绍nlog

一. 引用程序集, nuget 安装NLog.Web.AspNetCore

.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

二. 创建nlog.config配置文件, 可以直接复制下面的配置文件内容

具体的配置说明 可以参考 https://www.cjavapy.com/article/183/ 

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Off"
internalLogFile="c:\temp\internal-nlog.txt">

<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>

<!-- the targets to write to -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="${basedir}/logs/${logger}/${shortdate}.log"
layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace} ${newline} ${exception:format=tostring} ${newline}" />

<!-- another file log, only own logs. Uses some ASP.NET core renderers -->
<target xsi:type="Debugger" name="debugger" layout="${date:format=HH\:mm\:ss.fff}: ${message}" />
</targets>

<!-- rules to map from logger name to target -->
<rules>
<!--Skip non-critical Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" maxlevel="Error" final="true" />
<logger name="*" minlevel="Debug" writeTo="debugger" />
<logger name="*" minlevel="Info" writeTo="allfile" />
</rules>
</nlog>

.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Off"
      internalLogFile="c:\temp\internal-nlog.txt">

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file  -->
    <target xsi:type="File" name="allfile" fileName="${basedir}/logs/${logger}/${shortdate}.log"
            layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace} ${newline} ${exception:format=tostring} ${newline}" />

    <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    <target xsi:type="Debugger" name="debugger" layout="${date:format=HH\:mm\:ss.fff}: ${message}"  />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxlevel="Error" final="true" />
    <logger name="*" minlevel="Debug" writeTo="debugger" />
    <logger name="*" minlevel="Info" writeTo="allfile" />
  </rules>
</nlog>
.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

三. Program.cs 注入, UseNLog()

.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
            .UseNLog();// 添加这句 注入nlog
.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

四. 控制器里使用

.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore
        /// <summary>
        /// 日志
        /// </summary>
        private readonly ILogger<DemoController> _logger;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="logger"></param>
        public DemoController(ILogger<DemoController> logger)
        {
            _logger = logger;
        }

        public IActionResult Test()
        {
            _logger.LogError("我是日志内容");
            return Ok("ok");
        }
.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

结果

在输出里面会有结果

.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

 

 也可以在日志文件里看见

.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

 

五. 封装

虽然.net core 推荐依赖注入, 但是这种使用方式还是会不方便, 所以我可以封装成一个类, 需要的时候直接用. 代码如下:

.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore
.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore
/// <summary>
    /// Nlog日志帮助类
    /// Trace 包含大量的信息,例如 protocol payloads。一般仅在开发环境中启用, 仅输出不存文件。
    /// Debug  比 Trance 级别稍微粗略,一般仅在开发环境中启用, 仅输出不存文件。
    /// Info 一般在生产环境中启用。
    /// Warn 一般用于可恢复或临时性错误的非关键问题。
    /// Error 一般是异常信息。
    /// Fatal - 非常严重的错误!
    /// </summary>
    public class NLogHelper
    {
        readonly Logger logger;

        private NLogHelper(Logger logger)
        {
            this.logger = logger;
        }

        /// <summary>
        /// 自定义 ${logger} (我用于区分文件夹)
        /// </summary>
        /// <param name="name"></param>
        public NLogHelper(string name) : this(NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetLogger(name))
        {
        }

        /// <summary>
        /// 默认 ${logger} (Default 文件夹下)
        /// </summary>
        public static NLogHelper Default { get; private set; }
        static NLogHelper()
        {
            Default = new NLogHelper(NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetLogger("Default"));
        }

        public void Debug(string msg, params object[] args)
        {
            logger.Debug(msg, args);
        }
        public void Debug(string msg, Exception err)
        {
            logger.Debug(err, msg);
        }

        public void Info(string msg, params object[] args)
        {
            logger.Info(msg, args);
        }

        public void Info(string msg, Exception err)
        {
            logger.Info(err, msg);
        }

        public void Trace(string msg, params object[] args)
        {
            logger.Trace(msg, args);
        }

        public void Trace(string msg, Exception err)
        {
            logger.Trace(err, msg);
        }

        public void Error(string msg, params object[] args)
        {
            logger.Error(msg, args);
        }

        public void Error(string msg, Exception err)
        {
            logger.Error(err, msg);
        }

        public void Fatal(string msg, params object[] args)
        {
            logger.Fatal(msg, args);
        }

        public void Fatal(string msg, Exception err)
        {
            logger.Fatal(err, msg);
        }
    }
.net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

使用方式

        public IActionResult Test()
        {
            NLogHelper.Default.Fatal("默认logger");
            new NLogHelper("Diy").Error("自定义logger");
            return Ok("ok");
        }
上一篇:Asp.Net Core用NLog记录日志操作方法


下一篇:web.xml浅析