日志作用域的场景
- 一个事务包含多条操作时
- 复杂流程的日志关联时
- 调用点追踪与请求处理过程对应时
示例
继续沿用上一节代码,稍微做一些修改
using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using System;namespace LoggingSimpleDemo{class Program{static void Main(string[] args){// 利用之前的方式加载json配置var builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json", false, true);var config = builder.Build();IServiceCollection servicesCollection = new ServiceCollection();// 使用工厂模式将配置对象注册到容器管理servicesCollection.AddSingleton<IConfiguration>(p => config);servicesCollection.AddLogging(builder =>{builder.AddConfiguration(config.GetSection("Logging"));builder.AddConsole();builder.AddDebug();});IServiceProvider services = servicesCollection.BuildServiceProvider();var logger = services.GetService<ILogger<Program>>();// 创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。using (logger.BeginScope("ScopeId : {id}",Guid.NewGuid())){logger.LogInformation("Scope.Info");logger.LogError("Scope.Error");}Console.ReadKey();}}}
创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。
并在配置文件**appsettings.json**中**Console**下添加**"IncludeScopes": true,**
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"},"Console": {"IncludeScopes": true,"LogLevel": {"Default": "Information","Program": "Trace","alogger": "Information","LoggingSimpleDemo.OrderService": "Trace"}}}}
这时候执行代码:
然后我们将代码其改成循环输出的
using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using System;using System.Threading;namespace LoggingSimpleDemo{class Program{static void Main(string[] args){// 利用之前的方式加载json配置var builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json", false, true);var config = builder.Build();IServiceCollection servicesCollection = new ServiceCollection();// 使用工厂模式将配置对象注册到容器管理servicesCollection.AddSingleton<IConfiguration>(p => config);servicesCollection.AddLogging(builder =>{builder.AddConfiguration(config.GetSection("Logging"));builder.AddConsole();builder.AddDebug();});IServiceProvider services = servicesCollection.BuildServiceProvider();var logger = services.GetService<ILogger<Program>>();while (Console.ReadKey().Key != ConsoleKey.Escape){// 创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。using (logger.BeginScope("ScopeId : {id}", Guid.NewGuid())){logger.LogInformation("Scope.Info");logger.LogError("Scope.Error");}// 日志输出内部时异步的,需要等待以下保证输出顺序正确Thread.Sleep(200);Console.WriteLine("=============================================");}}}}
每次输出如下
这是,我们手动改一下配置,将**IncludeScopes: true**改为**false**,再按回车
可以看到输出发生了变化,也就意味着我们可以使用配置热更新的能力。
在.NET Core Web中可以在配置中添加**IncludeScopes: true**输出日志的时候,可以包含信息帮助我们把日志串联起来
