前言

前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题。

前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们的日志是错乱的。

如果有一个错误,那么我们只能过知道这个错误是哪里报错了,但是我们不知道触发的流程是什么样的,这对我们的debug不友好。

那么我们这时候就可以设置日志作用域。

正文

日志作用域适合下面的场景:

  1. 事务 因为一个事务有多个操作,那么希望这些操作能够有一个标识符,能够展示某一次事务的完整log

  2. 复杂的工作流相关的东西,记录一个工作流的具体过程

  3. 请求处理过程,就是上面所说的多个用户同时请求的日志错乱的问题,常用哈。

配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "Console": {
      "IncludeScopes": "true",
      "LogLevel": {
        "Default": "Information",
        "Program": "Trace",
      }
    }
  }
}

测试代码:

class Program
{
	static void Main(string[] args)
	{
		IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
		configurationBuilder.AddJsonFile("appsettings.json",optional:false,reloadOnChange:true);
		var config = configurationBuilder.Build();

		IServiceCollection serviceCollection = new ServiceCollection();
		serviceCollection.AddSingleton<IConfiguration>(p=>config);
		serviceCollection.AddLogging(builder =>
		{
			builder.AddConfiguration(config.GetSection("Logging"));
			builder.AddConsole();
		});

		IServiceProvider service = serviceCollection.BuildServiceProvider();

		var logger = service.GetService<ILogger<Program>>();

		using (logger.BeginScope("Current ScopeId:{scopeId}", Guid.NewGuid()))
		{
			logger.LogInformation("I am info.");
			logger.LogWarning("I am Warning");
			logger.LogError("I am Error");
		}

		Console.ReadKey();
	}
}

结果:
重新整理 .net core 实践篇—————日志系统之作用域[十七]-LMLPHP

设置IncludeScopes 为true 即可。

而在asp .net core项目中只要设置IncludeScopes 为true,对于每个请求,都是在同一个作用域内,故而ILogger打印的都会加上同一个一个唯一标识。

这里就不要演示了,在细节篇中会写入这个作用域如何实现的,东西比较多,就不放在实践篇了。

上述为个人整理,如有错误,望请指出。这一节写的比较少吧,因为在细节篇里面会详细介绍实现,而我们实践开发过程中只需要知道如何开启即可。

下一节:结构化日志

06-11 10:01