重新整理 .net core 實踐篇—————日誌系統之作用域[十七]

不問前世 發表於 2021-06-10

前言

前面介紹了服務與日誌之間的配置,那麼我們服務會遇到下面的場景會被遇到一些打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 實踐篇—————日誌系統之作用域[十七]

設定IncludeScopes 為true 即可。

而在asp .net core專案中只要設定IncludeScopes 為true,對於每個請求,都是在同一個作用域內,故而ILogger列印的都會加上同一個一個唯一標識。

這裡就不要演示了,在細節篇中會寫入這個作用域如何實現的,東西比較多,就不放在實踐篇了。

上述為個人整理,如有錯誤,望請指出。這一節寫的比較少吧,因為在細節篇裡面會詳細介紹實現,而我們實踐開發過程中只需要知道如何開啟即可。

下一節:結構化日誌