HttpContext.TraceIdentifier和Activity.Current.Id之间的差异



我使用一个"trace id";日志中。关于aspnet repo和SO的建议是从HttpContext.TraceIdentifier获取traceid。

但是,当框架为验证失败创建ProblemDetails时,它使用Activity.Current?.Id

示例:

var traceId1 = Activity.Current?.Id;        // OWZ4G27FO6UWH:00000003
var traceId2 = HttpContext.TraceIdentifier; // 00-2a8ee37903e657e3a95b41178dafc56e-91b02006afcf3133-00

我担心我的日志使用一种类型的跟踪id,而框架使用另一种类型——当我发现自己需要分析日志时,我会遇到问题。

这些有什么不同?我应该用哪个?框架通常使用哪种类型?

更新

我也问了回购,他们没有解释就结束了如果您有时间,请打开另一个问题,并参考已关闭的问题和此问题。提供一个链接,以便我们可以找到并投票支持您的问题

HttpContext.TraceIdentifier属性:获取或设置一个唯一标识符,以表示跟踪日志中的此请求

Activity.Current属性:获取或设置当前线程的当前操作(Activity(。

var traceId=活动。当前?。Id??httpContext?。TraceIdentifier;

从源代码中,我们可以看到它将使用活动Id作为首选,如果活动Id为null,它将使用httpContext?.TraceIdentifier,您也可以使用此方法来设置跟踪Id。

这里有一个可能成立的想法:

  • aspnetcore失败的任务可能与HTTP请求相关,也可能与HTTP不相关,但Activity.Current?.Id更相关,哪个子操作失败
  • aspnetcore的用户通常更关心哪个http请求失败,而不是底层框架的哪个方面,因此建议httpContext?.TraceIdentifier

因此,对于什么是最合适的ID,差异的出现可能与核心库和自定义服务器代码的角度不同。因此,大多数用户可能只应该遵循标准建议并使用httpContext?.TraceIdentifier,或者可能是:

// Use http first to trace to client call, if available
// If not, fall back on the thread ID
var traceId = httpContext?.TraceIdentifier ?? Activity.Current?.Id;

最新更新