这是我的第一个问题,但请告知我是否可以改进该问题。
我有一个 .NET Standard Web Api,它使用 Serilog 将请求记录到 Seq 服务器。我想在响应中添加一个相关 ID,以便在前端使用来跟踪请求。
这是日志记录配置Global.asax:
Log.Logger = new LoggerConfiguration()
.Enrich.With<HttpRequestIdEnricher>()
.Enrich.FromLogContext()
.WriteTo.Seq(ConfigurationManager.AppSettings["Seq:Url"])
.CreateLogger();
我有一个消息处理程序,它向所有请求添加相关 ID:
public class AddCorrelationIdToResponseHandler : DelegatingHandler
{
private const string CorrelationIdHeaderName = "X-Correlation-Id";
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var responseMessage = await base.SendAsync(request, cancellationToken);
var correlationId = request.GetCorrelationId().ToString();
responseMessage
.Headers
.Add(CorrelationIdHeaderName, correlationId);
return responseMessage;
}
}
问题是丰富器(可以理解)没有将 HttpRequestId 添加到响应标头中,因此我无法在前端使用它,并且无法将此处的相关 ID 获取到 Seq 日志中。
这是我尝试添加到处理程序中的内容:
LogContext.PushProperty(CorrelationIdHeaderName, correlationId)
Log.ForContext(CorrelationIdHeaderName, correlationId)
两者都无济于事。
我还将整个处理程序包装在带有 LogContext 语句的 using 语句中。
我认为问题可能是日志上下文在这里无效,因为实际的日志记录是在不同的地方自动发生的。
有没有办法可以访问 HttpRequestId 将其添加到标头中,或者如何才能将相关 ID 显示为 Seq 日志中的属性?作为最后的手段,是否可以关闭自动 Web Api 日志记录并使用 Log.Information 或 Log.Error 手动记录请求(在这种情况下,日志上下文理论上应该可以工作)?
任何帮助将不胜感激。
您可以使用 Serilog.Enrichers.ClientInfo nuget 包。在项目网站上查找更多信息。