问题描述
我创建了一个RestTemplate
拦截器(ClientHttpRequestInterceptor
)来记录请求和响应,并启用了Spring Cloud Sleuth,其目的是跟踪从拦截器接收到请求到返回的事务结果。但是,Sleuth的跟踪和跨度ID不会出现在拦截器日志消息中。看来它们只是在处理请求的后期。我希望能够跟踪到没有显式日志记录的服务,因此拦截器似乎是一种不错的方法,但是如果在此阶段无法添加跟踪和跨度ID,则可能需要寻找另一种方法。寻找任何将跟踪和跨度添加到拦截器日志消息中的建议,或另一种使用跟踪和跨度ID跨服务记录请求和响应的方法。谢谢!
编辑:这是我当前从启用了Spring Cloud Sleuth的RestTemplate
拦截器获取的日志输出示例:
2020-08-21 18:53:17.164 DEBUG [,] 14256 --- [ main] .c.o.l.RequestResponseLoggingInterceptor : ⇒ HTTP REQUEST: METHOD 'POST',URI 'http://localhost:59742/….
我真正想得到的是使用Sleuth trace
和span
id记录的请求(或响应):
2020-08-21 18:53:17.164 DEBUG [my-service-name,d3cb8a2fa7d1d9ac,80b023cb829bf254,false] 14256 --- [ main] .c.o.l.RequestResponseLoggingInterceptor : ⇒ HTTP REQUEST: METHOD 'POST',URI 'http://localhost:59742/….
我想知道这是否可能(例如,通过RestTemplate
拦截器和向所有服务添加日志记录,并使这些日志消息包含Sleuth ID)或是否存在其他差异我应该采用的方法来记录所有带有Sleuth跟踪/跨度ID的请求和响应。任何建议,我将不胜感激!
编辑2 :更多信息...我的Sleuth配置目前只不过是在bootstrap.yml
文件中启用它:
spring:
cloud:
sleuth:
enabled: true
我还创建/配置了一个自定义CommonsRequestLoggingFilter
,它在拦截器(日志的下一行)和确实在其日志消息中包含跟踪/跨度ID之后立即执行:
2020-08-21 18:53:17.164 DEBUG [my-app,false] 3479 --- [c-auto-1-exec-2] c.t.c.o.l.CustomrequestLoggingFilter : ⇒ POST ...
所以Sleuth似乎配置正确(至少出于我现在的目的);它只是没有将跟踪ID添加到拦截器的日志消息中。 谢谢!
解决方法
侦探文档说
您必须将RestTemplate注册为Bean,以便注入拦截器。如果您使用新关键字创建RestTemplate实例,则检测将无效。
我希望您不要使用new
关键字来实例化RestTemplate。