前言
前面介紹了服務與日誌之間的配置,那麼我們服務會遇到下面的場景會被遇到一些打log的問題。
前面我提及到我們的log,其實是在一個佇列裡面,而我們的請求是在併發的,多個使用者同時傳送請求這個時候我們的日誌是錯亂的。
如果有一個錯誤,那麼我們只能過知道這個錯誤是哪裡報錯了,但是我們不知道觸發的流程是什麼樣的,這對我們的debug不友好。
那麼我們這時候就可以設定日誌作用域。
正文
日誌作用域適合下面的場景:
-
事務 因為一個事務有多個操作,那麼希望這些操作能夠有一個識別符號,能夠展示某一次事務的完整log
-
複雜的工作流相關的東西,記錄一個工作流的具體過程
-
請求處理過程,就是上面所說的多個使用者同時請求的日誌錯亂的問題,常用哈。
配置
{
"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列印的都會加上同一個一個唯一標識。
這裡就不要演示了,在細節篇中會寫入這個作用域如何實現的,東西比較多,就不放在實踐篇了。
結
上述為個人整理,如有錯誤,望請指出。這一節寫的比較少吧,因為在細節篇裡面會詳細介紹實現,而我們實踐開發過程中只需要知道如何開啟即可。
下一節:結構化日誌