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

32 篇文章 41 订阅

1、前言

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

2、引入NLog

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

NLog
NLog.Web.AspNetCore

在这里插入图片描述

3、配置文件nlog.config

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

在这里插入图片描述

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

在这里插入图片描述
nlog.config文件中添加如下代码:

<?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"
      throwConfigExceptions="true"
      internalLogLevel="Off"
      internalLogFile="C:\temp\internal-nlog.txt">
	<targets>
		<!-- Trace级别日志,输出到文件 -->
		<target xsi:type="File"
                name="TraceFile"
                fileName="${basedir}/logs/${shortdate}_Trace.log"
                layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		<!-- Debug级别日志,输出到文件 -->
		<target xsi:type="File"
                name="DebugFile"
                fileName="${basedir}/logs/${shortdate}_Debug.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		<!-- Info级别日志,输出到文件 -->
		<target xsi:type="File"
                name="InfoFile"
                fileName="${basedir}/logs/${shortdate}_Info.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		<!-- Warn级别日志,输出到文件 -->
		<target xsi:type="File"
                name="WarnFile"
                fileName="${basedir}/logs/${shortdate}_Warn.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		<!-- Error级别日志,输出到文件 -->
		<target xsi:type="File"
                name="ErrorFile"
                fileName="${basedir}/logs/${shortdate}_Error.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
		<!-- Fatal级别日志,输出到文件 -->
		<target xsi:type="File"
                name="FatalFile"
                fileName="${basedir}/logs/${shortdate}_Fatal.log"
			    layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
	</targets>
	<rules>
		<!-- Microsoft.*表示通配符,所有微软日志将被过滤 -->
		<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";
        }
    }
}

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

在这里插入图片描述

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,代码如下:

<?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"
      throwConfigExceptions="true"
      internalLogLevel="Off"
      internalLogFile="C:\temp\internal-nlog.txt">
	<targets>
		<!-- Trace级别日志,输出到html文件 -->
		<target xsi:type="File"
                name="TraceFile"
                fileName="${basedir}/logs/${shortdate}_Trace.html"
                layout="【记录时间】:${longdate} &lt;br&gt;
				        【文名名称】:${logger} &lt;br&gt;
						【日志级别】:${uppercase:${level}} &lt;br&gt;
						【日志内容】:${message} ${exception} &lt;hr size=2 color=red&gt;" />
	</targets>
	<rules>
		<!-- Microsoft.*表示通配符,所有微软日志将被过滤 -->
		<logger name="Microsoft.*" minlevel="Trace"  final="true" />
		<logger name="*" minlevel="Trace" writeTo="TraceFile" />
	</rules>
</nlog>
&lt;br&gt;

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

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

同理,&lt;hr size=2 color=red&gt;表示<hr size=2 color=red>,也就是在html中定义一条分割线。程序运行结果如下所示:

在这里插入图片描述

7、结语

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.Net Core2.1+NLog+数据库连接 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" throwExceptions="true" internalLogLevel="warn" internalLogFile="logfiles/internal-nlog.txt"> <targets> <target xsi:type="Null" name="blackhole" /> <target name="database" xsi:type="Database" dbProvider="System.Data.SqlClient" connectionString="Data Source=127.0.0.1;Initial Catalog=MiddleData;User ID=lzhu;Password=bl123456;" > <!-- create table NLog ( Id int identity, Application nvarchar(50) null, Logged datetime null, Level nvarchar(50) null, Message nvarchar(512) null, Logger nvarchar(250) null, Callsite nvarchar(512) null, Exception nvarchar(512) null, constraint PK_NLOG primary key (Id) ) --> <commandText> insert into nlog ( Application, Logged, Level, Message, Logger, CallSite, Exception ) values ( @Application, @Logged, @Level, @Message, @Logger, @Callsite, @Exception ); </commandText> <parameter name="@application" layout="NLogTestDemo" /> <parameter name="@logged" layout="${date}" /> <parameter name="@level" layout="${level}" /> <parameter name="@message" layout="${message}" /> <parameter name="@logger" layout="${logger}" /> <parameter name="@callSite" layout="${callsite:filename=true}" /> <parameter name="@exception" layout="${exception:tostring}" /> </target> </targets> <rules> <!--Skip Microsoft logs and so log only own logs--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="NLogTestDemo.*" minlevel="Info" writeTo="database" /> </rules> </nlog>
好的,以下是使用NLog日志记录到SqlServer的步骤: 1. 首先,需要在项目中安装NLogNLog.Web.AspNetCore包。可以使用NuGet包管理器或在项目文件中手动添加依赖项。 2. 在项目的appsettings.json文件中添加以下NLog配置: ``` "NLog": { "targets": { "database": { "type": "Database", "dbProvider": "System.Data.SqlClient", "connectionString": "Server=[server];Database=[database];User Id=[user];Password=[password];", "commandText": "INSERT INTO [Logs] ([Date], [Level], [Logger], [Message], [Exception]) VALUES (@Date, @Level, @Logger, @Message, @Exception);", "parameter": [ { "name": "@Date", "layout": "${date}" }, { "name": "@Level", "layout": "${level}" }, { "name": "@Logger", "layout": "${logger}" }, { "name": "@Message", "layout": "${message}" }, { "name": "@Exception", "layout": "${exception}" } ] } }, "rules": [ { "logger": "*", "minLevel": "Trace", "writeTo": "database" } ] } ``` 3. 在Startup.cs文件中添加以下代码: ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { //... loggerFactory.AddNLog(); //... app.UseMiddleware<NLogMiddleware>(); //... } ``` 4. 创建一个名为Logs的表,用于存储日志记录。表结构应如下所示: ```sql CREATE TABLE [dbo].[Logs]( [Id] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime2](7) NOT NULL, [Level] [nvarchar](50) NOT NULL, [Logger] [nvarchar](250) NOT NULL, [Message] [nvarchar](max) NOT NULL, [Exception] [nvarchar](max) NULL, CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] ``` 5. 现在,可以在代码中使用NLog记录日志了。例如: ```csharp private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { _logger.LogInformation("Hello, world!"); return View(); } ``` 这将在Logs表中插入一条日志记录。 希望这可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值