如何创建一个从 HttpContext.TraceIdentifier 读取的 Serilog enricher?

How can I create a Serilog enricher that reads from HttpContext.TraceIdentifier?

我最近将 Serilog 集成到几个 .NET Standard class 库中,包括 MVC 6 项目使用的一些 class 库。我想做的是用 HttpContext.TraceIdentifier 丰富日志条目。我写了一个动作过滤器,将 HttpContext.TraceIdentifier 设置为 Correlation-ID 请求 header 值,如果存在:

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 属性,所以我不确定如何创建一个可以工作的 enricher。这可能吗?

我认为您不需要浓缩剂。

{RequestId} 放入接收器的 outputTemplate 会给我一个类似于“0HL0GJPLR7AOD”的 ID。如果我在记录某些内容之前设置 HttpContext.TraceIdentifier,那么 {RequestId} 会准确地给我那个 ID,因此自定义 ID 也可以与 {RequestId}.

一起使用

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

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