100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...

.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...

时间:2020-09-27 05:35:00

相关推荐

.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...

18 | 日志框架:聊聊记日志的最佳姿势

源码链接:

/witskeeper/geektime/tree/master/samples/LoggingSimpleDemo

日志框架必要的包:

1、Microsoft.Extensions.Logging

2、Microsoft.Extensions.Logging.Console

3、Microsoft.Extensions.Logging.Debug

4、Microsoft.Extensions.Logging.TraceSource

代码通过一个控制台程序,展示从读取配置到整个日志的记录器的构造和日志记录的过程

首先从文件读取配置

IConfigurationBuilder configBuilder = new ConfigurationBuilder();configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);var config = configBuilder.Build();

接着构造容器,注入对象

IServiceCollection serviceCollection = new ServiceCollection();// 构造容器// 用工厂模式将配置对象注册到容器管理// 注入的时候使用了一个委托,意味着容器可以帮我们管理这个对象的生命周期serviceCollection.AddSingleton<IConfiguration>(p => config);// 如果将实例直接注入,容器不会帮我们管理//serviceCollection.AddSingleton<IConfiguration>(config);// AddLogging 往容器里面注册了几个关键对象:// ILoggerFactory,泛型模板 typeof (ILogger<>),Logger 的过滤配置 IConfigureOptions<LoggerFilterOptions>// 最后一行,configure((ILoggingBuilder) new LoggingBuilder(services)); 就是整个注入我们的委托serviceCollection.AddLogging(builder =>{builder.AddConfiguration(config.GetSection("Logging"));// 注册 Logging 配置的 Sectionbuilder.AddConsole();// 先使用一个 Console 的日志输出提供程序});

AddLogging 源码

public static IServiceCollection AddLogging(this IServiceCollection services,Action<ILoggingBuilder> configure){if (services == null)throw new ArgumentNullException(nameof (services));services.AddOptions();services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());services.TryAdd(ServiceDescriptor.Singleton(typeof (ILogger<>), typeof (Logger<>)));services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<LoggerFilterOptions>>((IConfigureOptions<LoggerFilterOptions>) new DefaultLoggerLevelConfigureOptions(LogLevel.Information)));configure((ILoggingBuilder) new LoggingBuilder(services));return services;}

配置文件,appsettings.json

{"Logging": {"LogLevel": {"Default": "Debug","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"},"Console": {"LogLevel": {"Default": "Information","Program": "Trace","alogger": "Trace","LoggingSimpleDemo.OrderService": "None"}}}}

Logging 里面定义了 Log 的级别,Key 代表 Log 的名称,Value 代表 Logger 的级别

Console 是指针对 Console 的输出提供程序配置的日志级别

下面看一下日志级别的定义,按照严重程度从低到高

namespace Microsoft.Extensions.Logging{public enum LogLevel{Trace,Debug,Information,Warning,Error,Critical,None,}}

也就是说我们可以指定日志输出的最低级别

接着 BuildServiceProvider,从容器里面获取 ILoggerFactory

IServiceProvider service = serviceCollection.BuildServiceProvider();ILoggerFactory loggerFactory = service.GetService<ILoggerFactory>();

ILoggerFactory 的定义

namespace Microsoft.Extensions.Logging{public interface ILoggerFactory : IDisposable{// 输入的名称是 Logger 的名称,输出的结果是一个 ILogger 的对象,代表日志记录器ILogger CreateLogger(string categoryName);// 这个方法通常不会用到它,因为通常情况下注册容器提供程序会在 AddLogging 委托里面去注册,而不会用 AddProvider 方法void AddProvider(ILoggerProvider provider);}}

获取到 ILoggerFactory 之后就可以创建日志记录器

ILogger alogger = loggerFactory.CreateLogger("alogger");alogger.LogDebug(2001, "aiya");alogger.LogInformation("hello");var ex = new Exception("出错了");alogger.LogError(ex, "出错了");

因为配置文件中 alogger 的级别是 Trace

"alogger": "Trace",

所以这三行都会被打印出来

启动程序,输出如下:

dbug: alogger[2001]aiyainfo: alogger[0]hellofail: alogger[0]出错了System.Exception: 出错了

方括号的内容是 EventID,也就是针对每一个记录的位置事件,可以为它分配一个事件 ID,代码中在 LogDebug 的时候定义了一个事件 ID 是2001

假如说把 alogger 的日志级别调整成 Information

"alogger": "Information",

那么 Debug 级别的信息没有输出的

info: alogger[0]hellofail: alogger[0]出错了System.Exception: 出错了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。