在 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();
});
但这并没有改变任何东西。所以我的问题是:
- ElasticSearch 日志中的
fields.RequestId
来自哪里? ASP.NET核心应用如何设置?
- 如何覆盖此值?
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();
}
});
非常简单的方式,完全由我们自己掌控,不依赖框架版本。
我有一个简单的 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();
});
但这并没有改变任何东西。所以我的问题是:
- ElasticSearch 日志中的
fields.RequestId
来自哪里? ASP.NET核心应用如何设置? - 如何覆盖此值?
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();
}
});
非常简单的方式,完全由我们自己掌控,不依赖框架版本。