RestTemplate 日志记录拦截器 + Spring Cloud Sleuth

RestTemplate logging interceptor + Spring Cloud Sleuth

我创建了一个 RestTemplate 拦截器 (ClientHttpRequestInterceptor) 来记录请求和响应,并启用了 Spring Cloud Sleuth,目标是从拦截器收到请求时开始跟踪事务到 returns 结果的地步。但是,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 trace/span id 记录所有请求和响应。如果有任何建议,我将不胜感激!

编辑 2:更多信息...此时我的 Sleuth 配置只不过是在 bootstrap.yml 文件中启用它:

spring:
    cloud:
        sleuth:
            enabled: true

我还创建/配置了一个自定义 CommonsRequestLoggingFilter,它在拦截器之后执行(它是日志中的下一行)并且 有跟踪/跨度其日志消息中的 ID:

2020-08-21 18:53:17.164 DEBUG [my-app,d3cb8a2fa7d1d9ac,80b023cb829bf254,false] 3479 --- [c-auto-1-exec-2] c.t.c.o.l.CustomRequestLoggingFilter  : ⇒ POST ...

所以 Sleuth 似乎配置正确(至少现在对我来说是这样);它只是没有将跟踪 ID 添加到拦截器的日志消息中。 谢谢!

侦探文档说

You have to register RestTemplate as a bean so that the interceptors will get injected. If you create a RestTemplate instance with a new keyword then the instrumentation WILL NOT work.

希望您没有使用 new 关键字来实例化 RestTemplate。