Serilog将空白CorrelationId发送到Seq记录器

时间:2019-02-15 17:00:16

标签: .net-core serilog

我正在.net核心Web api中使用Serilog和Seq来处理日志记录。我添加了对史蒂夫·戈登(Steve Gordon)的CorrelationId Middleware的引用,以从标头获取X-Correlation-ID(或创建一个新的ID)以更新TraceIdentifier。

然后我添加了另一个中间件类,以将相关性id推送到日志上下文中,但这不能正常工作:

public class LogCorrelationIdMiddleware
{
    private readonly RequestDelegate _next;
    public LogCorrelationIdMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext context)
    {
        // doesn't work - blank CorrelationId in Seq
        using (LogContext.PushProperty("CorrelationId", context.Request.HttpContext.TraceIdentifier)) { return _next(context); }

        // works - correct CorrelationId2 in Seq 
        //using (LogContext.PushProperty("CorrelationId2", context.Request.HttpContext.TraceIdentifier)) { return _next(context); }
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当我执行以下操作(不是作为中间件)时,它对我有用:

using (LogContext.PushProperty("CorrelationId", "This is a test..."))
{
    Log.Write(level, exception, messageTemplate, propertyValues);
}

因此,我怀疑这是您的CorrelationId被ASP.NET Core MVC覆盖的原因,如下所示: https://github.com/serilog/serilog-aspnetcore/issues/59

此问题的一些背景及其在3.0中的解决方案也位于此处: https://github.com/aspnet/AspNetCore/issues/5918

很抱歉,这不是“修复”,但是我遇到了同样的问题,并且能够通过在日志调用(在我的代码中)和对Log.Write的调用之间添加一个间接级别来解决此问题。如上所示)。