本文https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/告诉我,字段TraceId可以用作相关ID,太好了!
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
=> ConnectionId:0HLR1BR0PL1CH
=> RequestPath:/weatherforecastproxy
RequestId:0HLR1BR0PL1CH:00000001,
SpanId:|363a800a-4cf070ad93fe3bd8.,
TraceId:363a800a-4cf070ad93fe3bd8,
ParentId: Executed endpoint 'FrontEndApp.Controllers.WeatherForecastProxyController.Get
(FrontEndApp)'
实际上,我可以看到在日志接收器中它的工作如广告所示:当Web应用程序A为请求提供服务并调用Web应用程序B时,它们两个都将相同的TraceId值写入日志。
据我了解,任何接收到传入Request-Id
头的ASP.NET Core应用程序都会将相同的头附加到传出的请求上,但是如果该头不存在于传入的请求上,则会有一个新值为传出请求生成。
已经要求我们将该值添加到来自Web应用程序A的响应中,但是(在传入请求中)它不(不足为奇)。
我一直在看System.Diagnostics.Activity
类,但是访问Activity.Current
并没有给我提供任何有用的实例-TraceID只是{}
-即为空。
我的问题是:如何在Web应用程序的上下文中访问TraceId值?
-S
答案 0 :(得分:3)
当我尝试添加带有TraceId值的标头时,我遇到了同样的问题。
通过ModelValidation进行了一些测试,然后看到在这种错误响应中,“ traceId”值是正确的,但是我无法以任何方式从http上下文变量中获取此值。
然后,我进入了网络核心源代码,以查看 DefaultProblemDetailsFactory 的实现并感到惊讶!通过执行以下操作可获取“ traceId”值:
var traceId = Activity.Current?.Id ?? httpContext?.TraceIdentifier;
是的,您可以使用Activity静态变量获取traceId。