• .net core中的那些常用的日志框架(Logging篇)


    前言

    日志,在我们每个项目中是必不可少的,它不仅能在调试的时候测试数据,而且在项目上线,也是我们排查错误的得力助手,那我就能谈谈,用的多的几个日志框架吧!如果有不对的地方,欢迎来指教错误,谢谢!

    Asp.Net Core日志中Logging篇

    一看这个名字,大家也能猜到,这是微软自带的一个日志框架。

    1.1引用

    创建ASP.NET Core程序,程序会自带Microsoft.Extensions.Logging,如果没有,请在Nuget安装
    

    1.2Program配置讲解

     public class Program
        {
            public static void Main(string[] args)
            {
                var host = CreateHostBuilder(args).Build();
                //获取日志服务(在Program作用域类)
                var logger = host.Services.GetRequiredService<ILogger<Program>>();
                logger.LogInformation("Start");
                host.Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(config=> {
                       //读取Json配置文件(读取日志的配置,这是设置为热更新)
                    config.AddJsonFile("appsettings.json",optional:false,reloadOnChange:true);
                   }).ConfigureLogging(log=> {
                       //日志添加到控制台
                       log.AddConsole();
                       //日志添加到debug调试窗口
                       log.AddDebug();
                   })
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
        }
    
    • host.Services.GetRequiredService<ILogger>():获取当前作用域的日志对象
    • config.AddJsonFile("appsettings.json",optional:false,reloadOnChange:true):加载配置文件(下图的配置文件),设置为热更新
    • log.AddConsole():日志添加到控制台
    • log.AddDebug():日志添加到debug调试窗口

    1.3配置文件

    在你项目中,找到appsetting.json文件,打开后,如下图:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Debug",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information",
        }
      },
    
        "AllowedHosts": "*"
      }
    
    

    你肯定会很疑惑,这些配置是什么意思,为啥要这样写?

    appsetting.json是一个配置文件,我们很多配置信息,都可以写到这个文件中来,日志的配置也是如此。

    Logging:是日志配置的默认名称,如果想自定义,也是可以,后面会演示
    LogLevel:日志级别(日志的输出是有输出级,如下图所示)
    Default:默认级别
    Microsoft:系统级别
    Microsoft.Hosting.Lifetime:生命周期
    
        public enum LogLevel
        {
            //应用程序数据。 这些消息默认情况下处于禁用状态,并且永远不应在生产环境中启用。
            Trace,
            //在开发过程中用于交互式调查的日志。 这些日志应该主要包含对调试有用的信息,并且没有长期的信息
            Debug,
            //跟踪应用程序一般流程的日志。 这些日志应具有长期
            Information,
            //在应用程序流中突出显示异常或意外事件的日志,但不会导致应用程序执行停止。
            Warning,
            //突出显示由于故障而停止当前执行流的日志。这些应表明当前活动失败,而不是整个应用程序范围内的失败。
            Error,
            //描述不可恢复的应用程序或系统崩溃或灾难性事件的日志,必须立即引起注意的故障。
            Critical,
            //不用于编写日志消息。 指定不应将日志记录类别
            None
        }
    
    

    优先等级从上到下递减Trace<Debug<Information<Warning<Error<Critical<None

    1.4如何封装自己定义的日志结构?

    我们可以新建一个类LoggerHelper,然后把ILogger接口的中定义的方法都实现一遍,可以自己加时间,加条件过滤等。把系统的日志框架,自己套一个壳,然后封装起来,然后就可以为所欲为了。

      /// <summary>
        /// 日志辅助类
        /// </summary>
    public class LoggerHelper
        {
            ILogger<LoggerHelper> _logger;
            public LoggerHelper(ILogger<LoggerHelper> logger)
            {
                _logger = logger;
            }
    
            public void LogInformation(string msg)
            {
                _logger.LogInformation(Write(msg));
            }
            public void LogDebug(string msg)
            {
                _logger.LogDebug(Write(msg));
            }
            public void LogError(string msg)
            { 
                _logger.LogError(Write(msg));
            }
            public void LogWarning(string msg)
            {
                _logger.LogWarning(Write(msg));
            }
    
            protected string Write(string msg)
            {
                return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + msg;
            }
        }
    

    第一步:注入服务

        public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
                services.AddTransient<LoggerHelper>();
            }
    

    第二步:添加构造函数

    private readonly LoggerHelper _logger;
    
            public WeatherForecastController(LoggerHelper logger)
            {
                _logger = logger;
            }
    

    第三步:调用服务

           _logger.LogInformation("LogInformation"+Guid.NewGuid().ToString("N"));
                    _logger.LogDebug("LogDebug" + Guid.NewGuid().ToString("N"));
                    _logger.LogWarning("LogWarning" + Guid.NewGuid().ToString("N"));
                    _logger.LogError("LogError" + Guid.NewGuid().ToString("N"));
    

    第四步:配置日志级别

      "Logging": {
        "LogLevel": {
          "Default": "Debug",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information",
           "LoggerHelper": "Information"
        },
        "Console": {
          "IncludeScopes": true
        }
      },
    

    第五步:效果展示

    看到这里是不是有疑问?

    • "IncludeScopes": true是什么意思?
      答:记录日志的 scope 信息, 对于 DeveloperExceptionPageMiddleware ,会在日志中记录 ConnectionId, RequestId, RequestPath。
    • "LoggerHelper": "Information"是什么意思?
      答:LoggerHelper就是我们自定义类,设置我们自己封装日志的日志级别
    • 怎么理解日志中的信息?
    info: Microsoft.Hosting.Lifetime[0]
          Now listening on: http://localhost:5000
    

    答:info:日志级别;Microsoft.Hosting.Lifetime[0]:日志作用域;Now listening on: http://localhost:5000日志内容

    总结:

    可能我这篇博客,还是比较浅显的,没有深入的介绍日志中不同作用域的日志级别,只是以我的角度,给大家讲解一下Asp.Net Core中的系统自带的日志框架的使用,以及如何封装一个自己一个类,特殊处理日志信息。

  • 相关阅读:
    tcp/ip协议
    linux系统优化项
    MySQL索引
    mysql命令中的group by 和 order by li'mit使用与技巧
    mysql命令
    WPF学习笔记01_XAML之简介
    【高精度】大整数的因子
    【高精度】计算2的N次方
    【高精度】大整数减法
    【高精度】大整数加法
  • 原文地址:https://www.cnblogs.com/2828sea/p/13672481.html
Copyright © 2020-2023  润新知