netcore- Nlog研究与学习使用
netcore- Nlog研究与学习使用
第一次将学习文档进行公开,心里还是蛮忐忑的,望大家见谅,希望与大家一起学习,一起共勉和进步,多余的话咱也不说了直接上干货。
workerService中使用Nlog
首先workerService是什么呢,workerService是netcore新出的一款框架,本质上还是控制台程序,大家可以在vs中选择workerService框架进行创建自己的项目,workerService包含主要的3中文件,1.program,这个大家都很熟悉了,2.appsettings.json这个大家也很熟悉,如果不知道是什么的同学请自行查看微软官方文档进行了解,里面有详细的介绍,3.Worker,顾名思义就是工作单元,也是workerService的核心,主要作用是为我们编写业务逻辑提供基础,具体的后面会有文章进行详细的介绍,本文的主要核心还是Nlog。
Nlog是一款优秀日志提供程序,什么事日志提供程序呢?这个也请查看微软官方文档进行了解,当然以后也会有相应的文章进行讲解,Nlog 官方网站上已经详细的介绍了Nlog的使用及源码,但是是英文的,对于英文不好的我阅读起来还是挺费劲了,所以为了以后更方便的使用Nlog,特意撰写这篇Nlog学习笔记,不足之处还望各位同仁海涵,下面进入正题
1.创建我们的Demo-使用workerService框架


基本框架内容就是这样子的,结构很明确也很简单,自动引用了 Microsoft.Extensions.Hosting Nget包,记住,除了aspnetcore外,基本netcore控制台程序都会使用Microsoft.Extensions.Hosting这个包,因为他非常非常重要,核心中的核心
2.引用Nlog包

通过Nlog搜索,我们会发现这里出现了很多包,其中这三个是非常重要的,我们来一一介绍,
第一个Nlog:Nlog的核心,
NLog.Extensions.Logging:就是我们要使用的Nlog的扩展,这个包主要作用是将Nlog和netcore基础日志组件结合也是netcore日志组件的实现,即Nlog日志提供程序
NLog.Web.AspNetCore:是Aspnetcore使用的Nlog扩展包,和NLog.Extensions.Logging有异曲同工之妙,原理都差不多
那么我们开始引用NLog.Extensions.Logging ,NLog.Extensions.Logging包含了Nlog核心包,所以我们只需要引用NLog.Extensions.Logging就可以了
3.开始使用Nlog
在program.cs中进行代码修改
在program.cs中引用
using Microsoft.Extensions.Logging; using NLog.Extensions.Logging;
Microsoft.Extensions.Logging是netcore框架自带的日志组件扩展,有了他我们就可以干一些不可描述的事,比如把netcore框架提供的日志的所有默认配置都干掉,比如编写我们自己的日志提供程序
NLog.Extensions.Logging 就是Nlog包的扩展包,这个帮助我们快速的将Nlog注入到netcore容器中
在CreateHostBuilder方法中添加代码
.ConfigureLogging(logconfig =>
{
logconfig.ClearProviders();
logconfig.AddNLog();
})
logconfig.ClearProviders(); 清理默认自带的日志配置信息及日志提供程序
logconfig.AddNLog();在日志容器中添加Nlog日志提供程序
最终的结果
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
namespace NLogDemo
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logconfig =>
{
logconfig.ClearProviders();
logconfig.AddNLog();
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}
在worker.cs文件中进行查看代码
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace NLogDemo
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
}
对,你没有看错,worker已经将log组件进行了引用和使用,是不是很神奇,把我们想干的事都干完了,真是心有灵犀一点通哇,那我们来分析一波,他都干了啥
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
这一步是依赖注入,注入了netcore日志组件
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
这一步是在异步执行方法中进行日志的记录,而且是每隔1秒调用一次。由于我们在program中注入了Nlog组件,所以netcore日志组件自动会调用Nlog组件中的记录日志方法进行日志记录,但是日志记录到了哪里呢,我在哪里可以看到呢,是不是缺少了什么配置呢,怎么总感觉不通呢?
是的你没有猜错,经过上面的代码,我们啥都干不了,那怎么样才能把日志记录到我们想要的地方呢,我们进入下一个环节
终极奥义--nlog.config配置文件

在我们项目的根目录下添加配置文件nlog.config,然后打开
<?xml version="1.0" encoding="utf-8" ?> <configuration> </configuration>
发现,啥都没得,就只有怎么几句代码
然后我们开始进行代码修改增加我们的nlog配置文件
<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<nlog
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogFile="c:\temp\console-example-internal.log"
internalLogLevel="Info"
>
<targets>
<target
xsi:type="ColoredConsole"
name="colorConsole"
encoding="Encoding"
detectConsoleAvailable="true"
detectOutputRedirected="false"
useDefaultRowHighlightingRules="false"
header="--------------------"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception} ${newline} ${stacktrace} ${newline}"
footer="---------------------"
>
<highlight-row condition="level == LogLevel.Trace" backgroundColor="White" foregroundColor="DarkGray"/>
<highlight-row condition="level == LogLevel.Debug" backgroundColor="White" foregroundColor="DarkBlue"/>
<highlight-row condition="level == LogLevel.Info" backgroundColor="Green" foregroundColor="White"/>
<highlight-row condition="level == LogLevel.Warn" backgroundColor="Magenta" foregroundColor="DarkYellow"/>
<highlight-row condition="level == LogLevel.Error" backgroundColor="Gray" foregroundColor="Red"/>
<highlight-row condition="level == LogLevel.Fatal" backgroundColor="Gray" foregroundColor="DarkRed"/>
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="colorConsole" />
</rules>
</nlog>
嗯,配置文件完成了,完美!好我们开始运行我们的程序,终极大招----dotnet run
嗯。。。等等好像忘了什么不了的的事情,对哇,这段配置是啥意思哇,这谁特么看的懂,作者是不是SB这都不进行解释。
郑重说明-作者不是SB,现在开始进行解释,别着急哇。这不是来了吗?
<nlog
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogFile="c:\temp\console-example-internal.log"
internalLogLevel="Info"
>
</nlog>
这是啥意思呢?首先Nlog标签大家应该是知道,有了它,Nlog组件才知道怎么读取配置信息
xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 这个不知道啥意思,有大神可以出来解释一波
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 这个也不知道
autoReload="true" 这个我知道,就是自动重新读取配置信息,就是咱们程序在运行的时候如果我们修改了配置文件,修改后的内容也会加载到咱们程序中,而且不用中断应用程序呦
internalLogFile="c:\temp\console-example-internal.log" 这个我也知道,就是如果Nlog组件产生了日志信息,这个日志信息存放在哪里
internalLogLevel="Info" 这个我当然知道了,就是Nlog组件产生的日志信息,那些是需要被记录的,那些是直接过滤的,根据不同的日志级别来进行筛选
<targets> </targets>
这个标签相当于一个容器,里面可以存放很多种类型的日志输出配置
重点来了
<target
xsi:type="ColoredConsole"
name="colorConsole"
encoding="Encoding"
detectConsoleAvailable="true"
detectOutputRedirected="false"
useDefaultRowHighlightingRules="false"
header="--------------------"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception} ${newline} ${stacktrace} ${newline}"
footer="---------------------"
>
<highlight-row condition="level == LogLevel.Trace" backgroundColor="White" foregroundColor="DarkGray"/>
<highlight-row condition="level == LogLevel.Debug" backgroundColor="White" foregroundColor="DarkBlue"/>
<highlight-row condition="level == LogLevel.Info" backgroundColor="Green" foregroundColor="White"/>
<highlight-row condition="level == LogLevel.Warn" backgroundColor="Magenta" foregroundColor="DarkYellow"/>
<highlight-row condition="level == LogLevel.Error" backgroundColor="Gray" foregroundColor="Red"/>
<highlight-row condition="level == LogLevel.Fatal" backgroundColor="Gray" foregroundColor="DarkRed"/>
</target>
这个target标签就是我们的输出配置
xsi:type="ColoredConsole" 这个是输出的类型,比如输出到文件哇,输出到控制台哇等等,甚至可以对接MQ,Redis等,具体的可以看官方文档,上面的配置我们采用的是带有颜色的控制台,为啥要用这个类型呢,因为他很骚包,有颜色哇
name="colorConsole" 这个呢就是咱们这个target的名称
encoding="Encoding" 编码格式,就是采用哪种字符集,比如utf-8哇,utf-16
detectConsoleAvailable="true" 这个就是如果未检测到控制台,要不要禁用这个输出配置,屁话,连控制台都没得,我输出个屁哇
detectOutputRedirected="false" 指示控制台目标在检测到时是否应禁用着色,啥意思呢,就是有控制台时,要不要把颜色给禁用掉,屁话,肯定不能哇,不然怎么体现作者的骚气呢
useDefaultRowHighlightingRules="false" 这个就有点意思了,就是Nlog已经默认采用了一些颜色配置,问我们要不要用,可以用,也可以不用,不用的话就要自己配置,这里我选择不用,为啥?还为啥,不体验一波你怎么他都有什么好玩的东西呢
header="--------------------" 这个就不用讲了,就是日志的头部信息
layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception} ${newline} ${stacktrace} ${newline}" 这个就是日志的格式,指定我们要输出什么内容,什么样的格式
footer="---------------------" 这个就是脚部信息
接下来,骚气的来了
<highlight-row condition="level == LogLevel.Trace" backgroundColor="White" foregroundColor="DarkGray"/>
<highlight-row condition="level == LogLevel.Debug" backgroundColor="White" foregroundColor="DarkBlue"/>
<highlight-row condition="level == LogLevel.Info" backgroundColor="Green" foregroundColor="White"/>
<highlight-row condition="level == LogLevel.Warn" backgroundColor="Magenta" foregroundColor="DarkYellow"/>
<highlight-row condition="level == LogLevel.Error" backgroundColor="Gray" foregroundColor="Red"/>
<highlight-row condition="level == LogLevel.Fatal" backgroundColor="Gray" foregroundColor="DarkRed"/>
这堆标签就是我们如何配置颜色。。。。。。
首先highlight-row标签是指明我们这里配置的是每行的样式
condition="level == LogLevel.Trace"就是条件,当满足什么条件时才进行样式的运用 条件的话有很多,官方上都有
backgroundColor="White" 这个就是背景颜色 颜色的话也有很多,官方上也都有
foregroundColor="DarkGray" 这个呢就是文字的颜色
<rules>
<logger name="*" minlevel="Trace" writeTo="colorConsole" />
</rules>
这个rule标签是用来设置哪些级别的日志用哪些输出设置,当然,也可以设置条件。比如内容包含某些关键字采用什么日志输出设置等等,都可以配置
当前我们用的是只要日志级别大于等于Trace,就用colorConsole输出设置,这里的colorConsole就是输出设置的名称
OK 解释的到不到位,我可以运行程序了吧
运行程序查看效果

嗯?怎么啥都没得,不应该哇,什么情况
嘿嘿,傻了吧?

这个不配置怎么能行呢,如果设置为不复制,相当于咱们的debug文件夹下没有nlog配置文件,不出问题才怪
好,那我们改一下试试

成功,万岁
等等,我们试一下其他类型的日志是怎么样的
为了方便查看
我们改写一下代码
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogTrace("LogTrace");
_logger.LogDebug("LogDebug");
_logger.LogInformation("LogInformation");
_logger.LogWarning("LogWarning");
_logger.LogError("LogError");
_logger.LogCritical("LogCritical");
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(1000, stoppingToken);
}
}
这样就是只执行一遍记录日志
我们来看一下效果

OK,完美,成功了!
嗯??仔细看看,不对吧,怎么没有trace和debug的信息,什么鬼情况
那是因为哇,netcore日志组件的日志级别默认是info才会被记录,低于info的不会记录滴,netcore的日志组件都将trace和debug给拦截了,自然也就到不了Nlog组件了,比较在netcore中NLog依赖netcore的日志组件
那我们怎么弄呢
别急,上代码
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logconfig =>
{
logconfig.ClearProviders();
logconfig.SetMinimumLevel(LogLevel.Trace);
logconfig.AddNLog();
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
我们只需要加上logconfig.SetMinimumLevel(LogLevel.Trace);这样一句话就OK了
当然我们也可以不加,然后在appsettings.json中加配置信息
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
将"Default": "Information",改为"Default": "Trace",
如在配置文件中配置,配置文件会覆盖代码中的logconfig.SetMinimumLevel(LogLevel.Trace);,所以呢最好在配置文件中配置,毕竟代码上线了,修改代码的代价比较大,直接改配置文件多好哇,
注意,当前应用程序的环境变量呦,如果是开发环境,请修改appsettings.Development.json这个文件
然后咱们再试试看

有木有?有木有?成功了!吊不吊!哈哈哈哈


浙公网安备 33010602011771号