我最近将Serilog集成到了几个.NET Standard类库中,包括一些MVC 6项目使用的类库。我想做的是使用HttpContext.TraceIdentifier
丰富日志条目。我编写了一个操作过滤器,将HttpContext.TraceIdentifier
设置为Correlation-ID
请求标头值(如果存在):
public override void OnActionExecuting(ActionExecutingContext context)
{
StringValues correlationIds;
Guid correlationId;
if (!context.HttpContext.Request.Headers.TryGetValue(Constants.CorrelationIdHeaderName, out correlationIds) || correlationIds.Count != 1 || !Guid.TryParse(correlationIds[0], out correlationId))
{
correlationId = _guidFactory.Random();
context.HttpContext.Response.Headers.Add(Constants.CorrelationIdHeaderName, correlationId.ToString("D"));
}
context.HttpContext.TraceIdentifier = correlationId.ToString("D");
base.OnActionExecuting(context);
}
问题是,在请求的生命周期中,如何让Serilog知道相关ID?由于它似乎没有HttpContext.Current
属性,我不知道如何创建一个可以工作的增强器。这甚至可能吗?
答案 0 :(得分:4)
我认为你不需要更加丰富。
将{RequestId}
放入接收器的outputTemplate
会给我一个类似“0HL0GJPLR7AOD”的ID。如果我在记录内容之前设置了HttpContext.TraceIdentifier
,那么{RequestId}
会为我提供该ID,因此自定义ID也适用于{RequestId}
。
我认为{RequestId}
是一个Microsoft.Extensions.Logging功能,但它与serilog开箱即用(至少在你使用Serilog.Extensions.Logging时)。
更新:不要忘记配置Enrich.FromLogContext()
。