日志作用域的场景

  • 一个事务包含多条操作时
  • 复杂流程的日志关联时
  • 调用点追踪与请求处理过程对应时

示例

继续沿用上一节代码,稍微做一些修改

  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Microsoft.Extensions.Logging;
  4. using System;
  5. namespace LoggingSimpleDemo
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. // 利用之前的方式加载json配置
  12. var builder = new ConfigurationBuilder();
  13. builder.AddJsonFile("appsettings.json", false, true);
  14. var config = builder.Build();
  15. IServiceCollection servicesCollection = new ServiceCollection();
  16. // 使用工厂模式将配置对象注册到容器管理
  17. servicesCollection.AddSingleton<IConfiguration>(p => config);
  18. servicesCollection.AddLogging(builder =>
  19. {
  20. builder.AddConfiguration(config.GetSection("Logging"));
  21. builder.AddConsole();
  22. builder.AddDebug();
  23. });
  24. IServiceProvider services = servicesCollection.BuildServiceProvider();
  25. var logger = services.GetService<ILogger<Program>>();
  26. // 创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。
  27. using (logger.BeginScope("ScopeId : {id}",Guid.NewGuid()))
  28. {
  29. logger.LogInformation("Scope.Info");
  30. logger.LogError("Scope.Error");
  31. }
  32. Console.ReadKey();
  33. }
  34. }
  35. }

创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。
并在配置文件**appsettings.json****Console**下添加**"IncludeScopes": true,**

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Information",
  5. "Microsoft": "Warning",
  6. "Microsoft.Hosting.Lifetime": "Information"
  7. },
  8. "Console": {
  9. "IncludeScopes": true,
  10. "LogLevel": {
  11. "Default": "Information",
  12. "Program": "Trace",
  13. "alogger": "Information",
  14. "LoggingSimpleDemo.OrderService": "Trace"
  15. }
  16. }
  17. }
  18. }

这时候执行代码:image.png
然后我们将代码其改成循环输出的

  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Microsoft.Extensions.Logging;
  4. using System;
  5. using System.Threading;
  6. namespace LoggingSimpleDemo
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. // 利用之前的方式加载json配置
  13. var builder = new ConfigurationBuilder();
  14. builder.AddJsonFile("appsettings.json", false, true);
  15. var config = builder.Build();
  16. IServiceCollection servicesCollection = new ServiceCollection();
  17. // 使用工厂模式将配置对象注册到容器管理
  18. servicesCollection.AddSingleton<IConfiguration>(p => config);
  19. servicesCollection.AddLogging(builder =>
  20. {
  21. builder.AddConfiguration(config.GetSection("Logging"));
  22. builder.AddConsole();
  23. builder.AddDebug();
  24. });
  25. IServiceProvider services = servicesCollection.BuildServiceProvider();
  26. var logger = services.GetService<ILogger<Program>>();
  27. while (Console.ReadKey().Key != ConsoleKey.Escape)
  28. {
  29. // 创建一个BeginScope,泛型方法BeginScope<TState>为多次相关的日志记录操作创建一个相同的执行上下文范围,并将其上下文范围与一个TState对象进行关联。
  30. using (logger.BeginScope("ScopeId : {id}", Guid.NewGuid()))
  31. {
  32. logger.LogInformation("Scope.Info");
  33. logger.LogError("Scope.Error");
  34. }
  35. // 日志输出内部时异步的,需要等待以下保证输出顺序正确
  36. Thread.Sleep(200);
  37. Console.WriteLine("=============================================");
  38. }
  39. }
  40. }
  41. }

每次输出如下
image.png
这是,我们手动改一下配置,将**IncludeScopes: true**改为**false**,再按回车
image.png
可以看到输出发生了变化,也就意味着我们可以使用配置热更新的能力。

.NET Core Web中可以在配置中添加**IncludeScopes: true**输出日志的时候,可以包含信息帮助我们把日志串联起来