• .net 温故知新:【9】.NET日志记录 ILogger使用和原理


    日志

    日志作为我们程序记录的“黑匣子”不论什么系统都应该使用到的,比如我们经常使用的log4net就是第三方日志记录提供程序。.NET 支持使用各种内置和第三方日志记录提供程序的日志记录 API,这篇文章主要介绍的是内置提供程序和API的使用并看下他们是如何实现的。

    日志优先级

    如果你使用过log4net的话那么你对这个优先级应该不陌生,在日志记录过程中我们可以对记录的日志信息进行优先级划分,根据优先级我们可以配置只记录哪些优先级别的日志,同时日志信息也会标记这条信息的优先级。在我们查找问题的时候更好的筛选和定位。

    .net 的日志优先级LogLevel 分为:

    Trace = 0、Debug = 1、Information = 2、Warning = 3、Error = 4、Critical = 5 和 None = 6。

    日志级别:

    Trace

    使用控制台输出日志

    现在我们来感受下如何用内置提供程序记录日志,使用的是.NET 6 控制台程序进行示例。

    • 添加Install-Package Microsoft.Extensions.Logging 日志基础包
      Install-Package Microsoft.Extensions.Logging

    • 添加Microsoft.Extensions.Logging.Console 控制台输出日志提供程序包
      Install-Package Microsoft.Extensions.Logging.Console

    • DI注入

    ServiceCollection services = new ServiceCollection();
    //添加日志到容器
    services.AddLogging(loggingBuilder =>
        {
            loggingBuilder.AddConsole();
        }
        //回调,或者是叫委托方法,调用AddConsole()添加控制台输入提供程序Provider。
        //AddConsole方法就是在Microsoft.Extensions.Logging.Console包中LoggingBuilder的扩展方法。
    );
    
    

    可以通过容器Provider直接获取日志对象然后调用写日志方法。

    image

    当然更常用的是在其它类中通过构造函数注入,使用 DI 中的 ILogger 对象(TCategoryName 类别字符串是任意的,但约定将使用类名称,在日志中能知道是哪个类输出的)。

        public class TestLog
        {
            private readonly ILogger _logger;
            public TestLog(ILogger logger)
            {
                _logger = logger;
            }
    
            public void Test()
            {
                _logger.LogDebug("测试");
            }
        }
    

    上面的控制台打印我们注意到没有输出“调试日志”,“信息日志”,这是因为未设置默认日志级别,则默认的日志级别值为 Information。所以输出程序只输出>=Information的日志。

    通过代码设置:
    image

    日志设计的原理

    如下我大概画了一个逻辑图,对于如何实现日志进行了一个梳理,代码部分未.net源码截取。

    image

    通过如上的流程我们知道其实日志对象是由LoggerFactory类创建的,所以我们不使用注入的方式也可以直接获取日志对象并写日志。

                var loggerFactory = LoggerFactory.Create(builder =>
                {
                    builder.AddConsole();
                    builder.SetMinimumLevel(LogLevel.Debug);
                });
    
                ILogger loger = loggerFactory.CreateLogger();
    

    image

    提供程序

    目前内置的日志记录提供程序:

    • Console:Console 提供程序将输出记录到控制台。
    • Debug:Debug 提供程序使用 System.Diagnostics.Debug 类写入日志输出。
    • EventSource:EventSource 提供程序写入名称为 Microsoft-Extensions-Logging 的跨平台事件源。
    • EventLog:EventLog 提供程序将日志输出发送到 Windows 事件日志。
      比如我们在测试里面添加一个EventLog将日志写入Windows 事件日志:
      安装提供程序包:Install-Package Microsoft.Extensions.Logging.EventLog
      image

    内置程序未提供对日志记录到文件,所以我们可以使用一些三方包,当然也可以自己开发。

    image
    查看地址:三方包

    在上一篇 .NET 配置 中我们也见到提供程序这个概念,或者是说这种设计结构,其实.net中很多地方都用到提供程序的思维,然可以灵活扩展。

  • 相关阅读:
    js每日十题
    MongoDB Shell 安装说明
    代码随想录算法训练营第四十二天| 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集
    零基础学Python之循环语句的使用(手把手带你做牛客网python代码练习题)
    Vux购物车案例
    HP惠普暗影精灵8P笔记本OMEN 17.3 英寸游戏本 17-ck1000(509V8AV)原厂Win11系统22H2
    前端开发ui设计稿在网页上的实现
    22-07-19 西安 RabbitMQ(03) 消息可靠投递、消费端限流、死信队列、延迟队列、集群搭建
    SpringMVC实现增删改查(CRUD)--从头到尾全面详细讲解
    一文总览 Alameda Research 的投资版图:公链、DeFi、NFT 等多领域四面出击
  • 原文地址:https://www.cnblogs.com/SunSpring/p/16875968.html