在 ASP.NET 核心应用的 ElasticSearch 日志中覆盖 fields.RequestId

Override fields.RequestId in ElasticSearch logs from ASP.NET Core app

我有一个简单的 ASP.NET 核心控制台应用程序,带有 Serilog 日志记录,可将日志写入 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 服务器 运行ning 作为简单的控制台应用程序是可以的。但据我所知,我们可以使用中间件来设置HttpContext.TraceIdentifier,它将被用作RequestId。所以我在构建应用程序时添加了简单的中间件:

app.Use(async (context, next) =>
{
    context.TraceIdentifier = Guid.NewGuid().ToString();
    await next();
});

但这并没有改变任何东西。所以我的问题是:

  1. ElasticSearch 日志中的 fields.RequestId 来自哪里? ASP.NET核心应用如何设置?
  2. 如何覆盖此值?

Where fields.RequestId in ElasticSearch logs comes from? How ASP.NET Core app sets it?

this回答够好吗?

How can I override this value?

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();
    }
});

非常简单的方式,完全由我们自己掌控,不依赖框架版本。