.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...
18 | 日志框架:聊聊記日志的最佳姿勢(shì)
源碼鏈接:
https://github.com/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
代碼通過(guò)一個(gè)控制臺(tái)程序,展示從讀取配置到整個(gè)日志的記錄器的構(gòu)造和日志記錄的過(guò)程
首先從文件讀取配置
IConfigurationBuilder configBuilder = new ConfigurationBuilder(); configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); var config = configBuilder.Build();接著構(gòu)造容器,注入對(duì)象
IServiceCollection serviceCollection = new ServiceCollection();// 構(gòu)造容器 // 用工廠模式將配置對(duì)象注冊(cè)到容器管理 // 注入的時(shí)候使用了一個(gè)委托,意味著容器可以幫我們管理這個(gè)對(duì)象的生命周期 serviceCollection.AddSingleton<IConfiguration>(p => config); // 如果將實(shí)例直接注入,容器不會(huì)幫我們管理 //serviceCollection.AddSingleton<IConfiguration>(config);// AddLogging 往容器里面注冊(cè)了幾個(gè)關(guān)鍵對(duì)象: // ILoggerFactory,泛型模板 typeof (ILogger<>),Logger 的過(guò)濾配置 IConfigureOptions<LoggerFilterOptions> // 最后一行,configure((ILoggingBuilder) new LoggingBuilder(services)); 就是整個(gè)注入我們的委托 serviceCollection.AddLogging(builder => {builder.AddConfiguration(config.GetSection("Logging"));// 注冊(cè) Logging 配置的 Sectionbuilder.AddConsole();// 先使用一個(gè) 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 的級(jí)別,Key 代表 Log 的名稱,Value 代表 Logger 的級(jí)別
Console 是指針對(duì) Console 的輸出提供程序配置的日志級(jí)別
下面看一下日志級(jí)別的定義,按照嚴(yán)重程度從低到高
namespace Microsoft.Extensions.Logging {public enum LogLevel{Trace,Debug,Information,Warning,Error,Critical,None,} }也就是說(shuō)我們可以指定日志輸出的最低級(jí)別
接著 BuildServiceProvider,從容器里面獲取 ILoggerFactory
IServiceProvider service = serviceCollection.BuildServiceProvider();ILoggerFactory loggerFactory = service.GetService<ILoggerFactory>();ILoggerFactory 的定義
namespace Microsoft.Extensions.Logging {public interface ILoggerFactory : IDisposable{// 輸入的名稱是 Logger 的名稱,輸出的結(jié)果是一個(gè) ILogger 的對(duì)象,代表日志記錄器ILogger CreateLogger(string categoryName);// 這個(gè)方法通常不會(huì)用到它,因?yàn)橥ǔG闆r下注冊(cè)容器提供程序會(huì)在 AddLogging 委托里面去注冊(cè),而不會(huì)用 AddProvider 方法void AddProvider(ILoggerProvider provider);} }獲取到 ILoggerFactory 之后就可以創(chuàng)建日志記錄器
ILogger alogger = loggerFactory.CreateLogger("alogger");alogger.LogDebug(2001, "aiya"); alogger.LogInformation("hello");var ex = new Exception("出錯(cuò)了"); alogger.LogError(ex, "出錯(cuò)了");因?yàn)榕渲梦募?alogger 的級(jí)別是 Trace
"alogger": "Trace",所以這三行都會(huì)被打印出來(lái)
啟動(dòng)程序,輸出如下:
dbug: alogger[2001]aiya info: alogger[0]hello fail: alogger[0]出錯(cuò)了 System.Exception: 出錯(cuò)了方括號(hào)的內(nèi)容是 EventID,也就是針對(duì)每一個(gè)記錄的位置事件,可以為它分配一個(gè)事件 ID,代碼中在 LogDebug 的時(shí)候定義了一個(gè)事件 ID 是2001
假如說(shuō)把 alogger 的日志級(jí)別調(diào)整成 Information
"alogger": "Information",那么 Debug 級(jí)別的信息沒有輸出的
info: alogger[0]hello fail: alogger[0]出錯(cuò)了 System.Exception: 出錯(cuò)了總結(jié)
以上是生活随笔為你收集整理的.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【朝夕技术专刊】Core3.1WebAp
- 下一篇: Istio 1.5 发布——拥抱变化,爱