前言
前面介紹了服務與日志之間的配置,那么我們服務會遇到下面的場景會被遇到一些打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打印的都會加上同一個一個唯一標識。
這里就不要演示了,在細節篇中會寫入這個作用域如何實現的,東西比較多,就不放在實踐篇了。
結
上述為個人整理,如有錯誤,望請指出。這一節寫的比較少吧,因為在細節篇里面會詳細介紹實現,而我們實踐開發過程中只需要知道如何開啟即可。
下一節:結構化日志