.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...
18 | 日志框架:聊聊記日志的最佳姿勢
源碼鏈接:
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
代碼通過一個控制臺程序,展示從讀取配置到整個日志的記錄器的構造和日志記錄的過程
首先從文件讀取配置
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]aiya info: alogger[0]hello fail: alogger[0]出錯了 System.Exception: 出錯了方括號的內容是 EventID,也就是針對每一個記錄的位置事件,可以為它分配一個事件 ID,代碼中在 LogDebug 的時候定義了一個事件 ID 是2001
假如說把 alogger 的日志級別調整成 Information
"alogger": "Information",那么 Debug 級別的信息沒有輸出的
info: alogger[0]hello fail: alogger[0]出錯了 System.Exception: 出錯了總結
以上是生活随笔為你收集整理的.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【朝夕技术专刊】Core3.1WebAp
- 下一篇: asp.net ajax控件工具集 Au