我有一個帶有 Serilog 日志記錄的簡單 ASP.NET Core 控制臺應用程式,它將日志寫入 ElasticSearch:
private static void ConfigureLogging(bool isTestEnvironment)
{
var configuration = new ConfigurationBuilder()
.AddAppSettingsConfig()
.Build();
var loggerConfiguration = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Debug()
.WriteTo.Console()
.WriteTo.Elasticsearch(
new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"]))
{
AutoRegisterTemplate = true,
IndexFormat = $"sample-{DateTime.UtcNow:yyyy-MM-dd}"
})
.ReadFrom.Configuration(configuration);
Log.Logger = loggerConfiguration.CreateLogger();
}
我有一個帶有這種方法的控制器:
[HttpPost(nameof(AnalyzeUpdatedBug))]
public async Task<ActionResult> AnalyzeUpdatedBug(WiUpdatedChangePayload payload)
當我運行應用程式并向此端點發出請求時,我會在 ElasticSearch 中獲得如下日志:

如您所見,有很多fields.屬性。但我對fields.RequestId. 它總是一樣的,從我在網上了解到的,Kestrel 服務器作為簡單的控制臺應用程式運行是可以的。但據我所知,我們可以使用中間件來設定HttpContext.TraceIdentifier,它將用作RequestId. 所以我在構建應用程式時添加了簡單的中間件:
app.Use(async (context, next) =>
{
context.TraceIdentifier = Guid.NewGuid().ToString();
await next();
});
但這并沒有改變任何事情。所以我的問題是:
fields.RequestIdElasticSearch 日志來自哪里?ASP.NET Core 應用程式如何設定它?- 我怎樣才能覆寫這個值?
uj5u.com熱心網友回復:
ElasticSearch 日志中的 fields.RequestId 來自哪里?ASP.NET Core 應用程式如何設定它?
這個答案是否足夠好?
我怎樣才能覆寫這個值?
IMO,我認為我們不應該,至少復雜的干擾默認日志記錄范圍HostingApplicationDiagnostics根本不是一個好主意。相反,我看到我們只需要一些東西來傳播請求,它應該很簡單,讓我們完全控制它(誰知道未來日志機制是否有一些重大變化?)
因此,相反,如何制作我們自己的CorrelationId?。就像是
app.Use(async (context, next) =>
{
using (LogContext.PushProperty("XCorrelationId", Guid.NewGuid().ToString()))
{
// Place a try-catch here if the correlation was importance with exception.
await next();
}
});
非常簡單的方式,完全由我們控制,不依賴于框架版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371331.html
標籤:C# 。网 asp.net核心 serilog-sinks-elasticsearch
