使用 Serilog 添加相关 id 到 .NET Standard Web Api 中的 Seq

问题描述 投票:0回答:1

这是我的第一个问题,但请告知我是否可以改进该问题。

我有一个 .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 手动记录请求(在这种情况下,日志上下文理论上应该可以工作)?

任何帮助将不胜感激。

asp.net-web-api .net-standard serilog seq
1个回答
0
投票

您可以使用 Serilog.Enrichers.ClientInfo nuget 包。在项目网站上查找更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.