RestTemplate日志拦截器+ Spring Cloud Sleuth

问题描述

我创建了一个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 tracespan 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。