第一次将学习文档进行公开,心里还是蛮忐忑的,望大家见谅,希望与大家一起学习,一起共勉和进步,多余的话咱也不说了直接上干货。
首先workerService是什么呢,workerService是netcore新出的一款框架,本质上还是控制台程序,大家可以在vs中选择workerService框架进行创建自己的项目,workerService包含主要的3中文件,1.program,这个大家都很熟悉了,2.appsettings.json这个大家也很熟悉,如果不知道是什么的同学请自行查看微软官方文档进行了解,里面有详细的介绍,3.Worker,顾名思义就是工作单元,也是workerService的核心,主要作用是为我们编写业务逻辑提供基础,具体的后面会有文章进行详细的介绍,本文的主要核心还是Nlog。
Nlog是一款优秀日志提供程序,什么事日志提供程序呢?这个也请查看微软官方文档进行了解,当然以后也会有相应的文章进行讲解,Nlog 官方网站上已经详细的介绍了Nlog的使用及源码,但是是英文的,对于英文不好的我阅读起来还是挺费劲了,所以为了以后更方便的使用Nlog,特意撰写这篇Nlog学习笔记,不足之处还望各位同仁海涵,下面进入正题
基本框架内容就是这样子的,结构很明确也很简单,自动引用了 Microsoft.Extensions.Hosting Nget包,记住,除了aspnetcore外,基本netcore控制台程序都会使用Microsoft.Extensions.Hosting这个包,因为他非常非常重要,核心中的核心
通过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就可以了
在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(); }); } }
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_logger; public Worker(ILogger 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_logger; public Worker(ILogger 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配置文件
嗯,配置文件完成了,完美!好我们开始运行我们的程序,终极大招----dotnet run
嗯。。。等等好像忘了什么不了的的事情,对哇,这段配置是啥意思哇,这谁特么看的懂,作者是不是SB这都不进行解释。
郑重说明-作者不是SB,现在开始进行解释,别着急哇。这不是来了吗?
这是啥意思呢?首先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组件产生的日志信息,那些是需要被记录的,那些是直接过滤的,根据不同的日志级别来进行筛选
这个标签相当于一个容器,里面可以存放很多种类型的日志输出配置
重点来了
这个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" 这个呢就是文字的颜色
这个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(); });
我们只需要加上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这个文件
然后咱们再试试看
有木有?有木有?成功了!吊不吊!哈哈哈哈