背景

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

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

.net core 3.1 使用nlog记录日志 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
    





            
.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
    





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

三. Program.cs 注入, UseNLog()

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





            
.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

四. 控制器里使用

.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 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
.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
    





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

使用方式

        public IActionResult Test()
        {
            NLogHelper.Default.Fatal("默认logger");
            new NLogHelper("Diy").Error("自定义logger");
            return Ok("ok");
        }

背景

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

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

.net core 3.1 使用nlog记录日志 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
    





            
.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
    





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

三. Program.cs 注入, UseNLog()

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





            
.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

四. 控制器里使用

.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 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
.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
    





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

使用方式

        public IActionResult Test()
        {
            NLogHelper.Default.Fatal("默认logger");
            new NLogHelper("Diy").Error("自定义logger");
            return Ok("ok");
        }

相关文章:

  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2021-06-04
  • 2022-02-12
  • 2022-02-09
  • 2021-10-05
猜你喜欢
  • 2020-05-20
  • 2022-01-12
  • 2022-12-23
  • 2022-02-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案