如何深入理解.NET中ILogger日志记录的使用及其工作原理?

摘要:#日志 日志作为我们程序记录的“黑匣子”不论什么系统都应该使用到的,比如我们经常使用的log4net就是第三方日志记录提供程序。.NET 支持使用各种内置和第三方日志记录提供程序的日志记录 API,这篇文章主要介绍的是内置提供程序和API的
日志 日志作为我们程序记录的“黑匣子”不论什么系统都应该使用到的,比如我们经常使用的log4net就是第三方日志记录提供程序。.NET 支持使用各种内置和第三方日志记录提供程序的日志记录 API,这篇文章主要介绍的是内置提供程序和API的使用并看下他们是如何实现的。 日志优先级 如果你使用过log4net的话那么你对这个优先级应该不陌生,在日志记录过程中我们可以对记录的日志信息进行优先级划分,根据优先级我们可以配置只记录哪些优先级别的日志,同时日志信息也会标记这条信息的优先级。在我们查找问题的时候更好的筛选和定位。 .net 的日志优先级LogLevel 分为: Trace = 0、Debug = 1、Information = 2、Warning = 3、Error = 4、Critical = 5 和 None = 6。 日志级别: Trace<Debug<Information<Warning<Error<Critical<None 使用控制台输出日志 现在我们来感受下如何用内置提供程序记录日志,使用的是.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直接获取日志对象然后调用写日志方法。 当然更常用的是在其它类中通过构造函数注入,使用 DI 中的 ILogger 对象(TCategoryName 类别字符串是任意的,但约定将使用类名称,在日志中能知道是哪个类输出的)。 public class TestLog { private readonly ILogger _logger; public TestLog(ILogger<TestLog> logger) { _logger = logger; } public void Test() { _logger.LogDebug("测试"); } } 上面的控制台打印我们注意到没有输出“调试日志”,“信息日志”,这是因为未设置默认日志级别,则默认的日志级别值为 Information。所以输出程序只输出>=Information的日志。 通过代码设置: 日志设计的原理 如下我大概画了一个逻辑图,对于如何实现日志进行了一个梳理,代码部分未.net源码截取。 通过如上的流程我们知道其实日志对象是由LoggerFactory类创建的,所以我们不使用注入的方式也可以直接获取日志对象并写日志。 var loggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); builder.SetMinimumLevel(LogLevel.Debug); }); ILogger loger = loggerFactory.CreateLogger<Program>(); 提供程序 目前内置的日志记录提供程序: Console:Console 提供程序将输出记录到控制台。
阅读全文