ASP.NET Core 3.1系列(31)——日志组件NLog的基础使用方法

1、前言

在生产环境中部署软件时,日志模块是必不可少的。在.NET Framework时代,Log4net是最常用的日志组件,而在.NET Core开发环境下,NLog的使用频率开始大幅提高。下面就来介绍一下NLog的基础使用方法。

2、引入NLog

新建一个Web API工程,使用NuGet引入如下组件:

NLog
NLog.Web.AspNetCore

ASP.NET Core 3.1系列(31)——日志组件NLog的基础使用方法_第1张图片

3、配置文件nlog.config

新建一个XML文件,文件名为nlog.config,如下图所示:

ASP.NET Core 3.1系列(31)——日志组件NLog的基础使用方法_第2张图片

nlog.config文件改为始终复制,如下图所示:

ASP.NET Core 3.1系列(31)——日志组件NLog的基础使用方法_第3张图片
nlog.config文件中添加如下代码:


<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwConfigExceptions="true"
      internalLogLevel="Off"
      internalLogFile="C:\temp\internal-nlog.txt">
	<targets>
		
		<target xsi:type="File"
                name="TraceFile"
                fileName="${basedir}/logs/${shortdate}_Trace.log"
                layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		
		<target xsi:type="File"
                name="DebugFile"
                fileName="${basedir}/logs/${shortdate}_Debug.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		
		<target xsi:type="File"
                name="InfoFile"
                fileName="${basedir}/logs/${shortdate}_Info.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		
		<target xsi:type="File"
                name="WarnFile"
                fileName="${basedir}/logs/${shortdate}_Warn.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		
		<target xsi:type="File"
                name="ErrorFile"
                fileName="${basedir}/logs/${shortdate}_Error.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		
		<target xsi:type="File"
                name="FatalFile"
                fileName="${basedir}/logs/${shortdate}_Fatal.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
	targets>
	<rules>
		
		<logger name="Microsoft.*" minlevel="Trace"  final="true" />
		<logger name="*" minlevel="Trace" writeTo="TraceFile" />
		<logger name="*" minlevel="Debug" writeTo="DebugFile" />
		<logger name="*" minlevel="Info" writeTo="InfoFile" />
		<logger name="*" minlevel="Warn" writeTo="WarnFile" />
		<logger name="*" minlevel="Error" writeTo="ErrorFile" />
		<logger name="*" minlevel="Fatal" writeTo="FatalFile" />
	rules>
nlog>

3.1、targets节点

在上面的代码中,targets节点用于定义若干日志目标,一个targets节点可以包含多个target节点。

xsi:type="File"

xsi:type="File"表示将日志保存到文件,其他常用的还有xsi:type="Console"xsi:type="Database"等。

name="TraceFile"

name="InfoFile"用于定义目标名称,开发者可自行定义。

fileName="${basedir}/logs/${shortdate}_Fatal.log"

fileName表示日志文件路径,这里的${basedir}是一个模板参数,它对应的路径是\bin\Debug\netcoreapp3.1\${shortdate}也是一个模板参数,它表示获取当前系统时间。如果你不熟悉这些模板参数,也可以直接定义路径,如D:\logs\Trace.log

layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"

layout表示日志文本的格式,这里的${longdate}表示日志记录的时间,${logger}表示在哪一个代码文件中写入了日志,${uppercase:${level}}表示日志等级,${message} ${exception}表示日志内容。

3.2、rules节点

rules节点用于定义一系列规则。

minlevel="Trace"

minlevel表示最低记录哪一级别的日志。一般来说,TraceDebug主要记录开发阶段的日志,系统正式上线后不需要记录这两个级别的日志。

writeTo="TraceFile"

writeTo参数表示按照哪个target进行写入。我们在上面定义了6target节点,writeTo参数的值就是target节点中name的值。

4、设置NLog为日志管理器

引入NLog的相关组件后,我们需要将NLog设置为系统的日志管理器,修改Program.cs文件,代码如下:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Web;

namespace App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            NLogBuilder.ConfigureNLog("nlog.config");
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .ConfigureLogging(logging=>
                {
                    logging.ClearProviders();
                })
                .UseNLog();
    }
}

5、生成日志

添加一个控制器HomeController,在其构造函数中注入ILogger接口,代码如下:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        protected readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public ActionResult<string> Get()
        {
            _logger.LogTrace("This is track info");
            _logger.LogDebug("This is debug info");
            _logger.LogInformation("This is info");
            _logger.LogWarning("This is warn info");
            _logger.LogError("This is error info");
            _logger.LogCritical("This is fatal info");
            return "Hello World";
        }
    }
}

运行程序,可以发现日志文件已经生成,如下图所示:

ASP.NET Core 3.1系列(31)——日志组件NLog的基础使用方法_第4张图片

5.1、Trace.log

rules中规定TraceFile的最低记录级别minlevel="Trace",因此Trace.log会记录Trace-Fatal的全部日志:

2023-02-06 14:26:37.0419|App.Controllers.HomeController|TRACE|This is track info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|DEBUG|This is debug info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|INFO|This is info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|WARN|This is warn info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|ERROR|This is error info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|FATAL|This is fatal info 

5.2、Debug.log

rules中规定DebugFile的最低记录级别minlevel="Debug",因此Debug.log会记录Debug-Fatal的全部日志:

2023-02-06 14:26:37.0809|App.Controllers.HomeController|DEBUG|This is debug info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|INFO|This is info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|WARN|This is warn info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|ERROR|This is error info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|FATAL|This is fatal info 

5.3、Info.log

rules中规定InfoFile的最低记录级别minlevel="Info",因此Info.log会记录Info-Fatal的全部日志:

2023-02-06 14:26:37.0809|App.Controllers.HomeController|INFO|This is info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|WARN|This is warn info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|ERROR|This is error info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|FATAL|This is fatal info 

5.4、Warn.log

rules中规定WarnFile的最低记录级别minlevel="Warn",因此Warn.log会记录Wran-Fatal的全部日志:

2023-02-06 14:26:37.0809|App.Controllers.HomeController|WARN|This is warn info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|ERROR|This is error info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|FATAL|This is fatal info 

5.5、Error.log

rules中规定ErrorFile的最低记录级别minlevel="Error",因此Error.log会记录Error-Fatal的全部日志:

2023-02-06 14:26:37.0809|App.Controllers.HomeController|ERROR|This is error info 
2023-02-06 14:26:37.0809|App.Controllers.HomeController|FATAL|This is fatal info 

5.6、Fatal.log

rules中规定FatalFile的最低记录级别minlevel="Fatal",因此Fatal.log会记录Fatal的全部日志:

2023-02-06 14:26:37.0809|App.Controllers.HomeController|FATAL|This is fatal info 

6、输出日志到html

上面实现了将日志消息记录到文本文件的操作,但随着日志数量的不断增加,阅读日志就会变得异常艰难。我们不妨将日志输出到html文件,然后利用一些简单的css属性来装饰一下,修改nlog.config,代码如下:


<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwConfigExceptions="true"
      internalLogLevel="Off"
      internalLogFile="C:\temp\internal-nlog.txt">
	<targets>
		
		<target xsi:type="File"
                name="TraceFile"
                fileName="${basedir}/logs/${shortdate}_Trace.html"
                layout="【记录时间】:${longdate} <br>
				        【文名名称】:${logger} <br>
						【日志级别】:${uppercase:${level}} <br>
						【日志内容】:${message} ${exception} <hr size=2 color=red>" />
	targets>
	<rules>
		
		<logger name="Microsoft.*" minlevel="Trace"  final="true" />
		<logger name="*" minlevel="Trace" writeTo="TraceFile" />
	rules>
nlog>
&lt;br&gt;

在上面的代码中,转义符<表示<>表示>,因此<br>就表示html中的换行符号

&lt;hr size=2 color=red&gt;

同理,<hr size=2 color=red>表示


,也就是在html中定义一条分割线。程序运行结果如下所示:

ASP.NET Core 3.1系列(31)——日志组件NLog的基础使用方法_第5张图片

7、结语

本文主要介绍了NLog的基础使用方法,实现了将日志写入文本文件和html的操作。在实际业务中,将日志记录到数据库中也是一项常见的操作,关于数据库中记录日志的相关操作我会在后续的博客中进行介绍。

你可能感兴趣的:(ASP.NET,Core,C#,ASP.NET,Core)