• 重新整理 .net core 实践篇—————日志系统之作用域[十七]


    前言

    前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打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();
    	}
    }
    

    结果:

    设置IncludeScopes 为true 即可。

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

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

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

    下一节:结构化日志

  • 相关阅读:
    你人生中的那口井挖了没有?
    Stream接口
    console (控制台)
    assert.fail()
    assert.strictEqual()
    assert.equal()
    assert.ifError()
    assert.ok()
    nodejs assert 模块
    闭包
  • 原文地址:https://www.cnblogs.com/aoximin/p/14854523.html
Copyright © 2020-2023  润新知