我正在.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); }
}
}
有什么想法吗?
答案 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的调用之间添加一个间接级别来解决此问题。如上所示)。