如何创建一个从 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()
。
我最近将 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()
。