在生产环境中部署软件时,日志模块是必不可少的。在.NET Framework
时代,Log4net
是最常用的日志组件,而在.NET Core
开发环境下,NLog
的使用频率开始大幅提高。下面就来介绍一下NLog
的基础使用方法。
新建一个Web API
工程,使用NuGet
引入如下组件:
NLog
NLog.Web.AspNetCore
新建一个XML
文件,文件名为nlog.config
,如下图所示:
将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>
在上面的代码中,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}
表示日志内容。
rules
节点用于定义一系列规则。
minlevel="Trace"
minlevel
表示最低记录哪一级别的日志。一般来说,Trace
和Debug
主要记录开发阶段的日志,系统正式上线后不需要记录这两个级别的日志。
writeTo="TraceFile"
writeTo
参数表示按照哪个target
进行写入。我们在上面定义了6
个target
节点,writeTo
参数的值就是target
节点中name
的值。
引入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();
}
}
添加一个控制器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";
}
}
}
运行程序,可以发现日志文件已经生成,如下图所示:
在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
在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
在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
在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
在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
在rules
中规定FatalFile
的最低记录级别minlevel="Fatal"
,因此Fatal.log
会记录Fatal
的全部日志:
2023-02-06 14:26:37.0809|App.Controllers.HomeController|FATAL|This is fatal info
上面实现了将日志消息记录到文本文件的操作,但随着日志数量的不断增加,阅读日志就会变得异常艰难。我们不妨将日志输出到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>
<br>
在上面的代码中,转义符<
表示<
,>
表示>
,因此<br>
就表示html
中的换行符号
。
<hr size=2 color=red>
同理,<hr size=2 color=red>
表示
,也就是在html
中定义一条分割线。程序运行结果如下所示:
本文主要介绍了NLog
的基础使用方法,实现了将日志写入文本文件和html
的操作。在实际业务中,将日志记录到数据库中也是一项常见的操作,关于数据库中记录日志的相关操作我会在后续的博客中进行介绍。