在 .NET Standard Web API 中使用 Serilog 到 Seq 添加相关 ID

Adding correlation id using Serilog to Seq in .NET Standard Web Api

提问人:Anonymous 提问时间:8/5/2020 更新时间:8/5/2020 访问量:2599

问:

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

我有一个 .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 语句中。

此处的 Seq 条目示例

我认为问题可能是日志上下文在这里无效,因为实际的日志记录会自动发生在不同的地方。

有没有办法访问 HttpRequestId 以将其添加到标头中,或者我怎样才能将相关 ID 显示为 Seq 日志中的属性?作为最后的手段,是否可以关闭自动 Web Api 日志记录并使用 Log.Information 或 Log.Error 手动记录请求(在这种情况下,日志上下文理论上应该有效)?

任何帮助将不胜感激。

ASP.NET-WEB-API . NET-STANDARD Serilog seq

评论


答: 暂无答案