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