如何创建从HttpContext.TraceIdentifier读取的Serilog richher?

时间:2016-10-21 20:14:21

标签: asp.net-core-mvc asp.net-core-1.0 action-filter serilog

我最近将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属性,我不知道如何创建一个可以工作的增强器。这甚至可能吗?

1 个答案:

答案 0 :(得分:4)

我认为你不需要更加丰富。

{RequestId}放入接收器的outputTemplate会给我一个类似“0HL0GJPLR7AOD”的ID。如果我在记录内容之前设置了HttpContext.TraceIdentifier,那么{RequestId}会为我提供该ID,因此自定义ID也适用于{RequestId}

我认为{RequestId}是一个Microsoft.Extensions.Logging功能,但它与serilog开箱即用(至少在你使用Serilog.Extensions.Logging时)。

更新:不要忘记配置Enrich.FromLogContext()