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框架

netcore- Nlog研究与学习使用_第1张图片

netcore- Nlog研究与学习使用_第2张图片

netcore- Nlog研究与学习使用_第3张图片

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

2.引用Nlog包

netcore- Nlog研究与学习使用_第4张图片

通过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.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 _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配置文件

netcore- Nlog研究与学习使用_第5张图片

在我们项目的根目录下添加配置文件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 解释的到不到位,我可以运行程序了吧

运行程序查看效果

netcore- Nlog研究与学习使用_第6张图片

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

嘿嘿,傻了吧?

netcore- Nlog研究与学习使用_第7张图片

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

好,那我们改一下试试

netcore- Nlog研究与学习使用_第8张图片

成功,万岁

等等,我们试一下其他类型的日志是怎么样的

为了方便查看

我们改写一下代码

        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);
            }
        }

这样就是只执行一遍记录日志

我们来看一下效果

netcore- Nlog研究与学习使用_第9张图片

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这个文件

然后咱们再试试看

netcore- Nlog研究与学习使用_第10张图片

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

你可能感兴趣的:(Nlog,c#,后端)