Spring Boot 3.0.2 WebClient日志前缀与HttpClient连接ID不匹配问题
WebClient日志前缀与Reactor Netty HttpClient连接ID不匹配问题
使用环境
- org.springframework.boot 版本
3.0.2 org.springframework.boot:spring-boot-starter-webflux
问题现象
在reactor.netty.http.server.HttpServer日志中,连接ID与exchange.getLogPrefix()返回值匹配,但WebClient场景下,clientRequest.logPrefix()输出的前缀和Reactor Netty HttpClient日志里的连接ID不匹配。
WebClient构建代码
return WebClient.builder() .clientConnector(new ReactorClientHttpConnector( HttpClient .create() .wiretap("reactor.netty.http.client.HttpClient", LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL) )) .baseUrl(foo) .defaultHeader("Accept", MediaType.APPLICATION_JSON_VALUE) .defaultHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE) .defaultHeader("Authorization", fooo) .filter(logRequest()) .build(); } private static ExchangeFilterFunction logRequest() { return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { String logPrefix = clientRequest.logPrefix(); LOGGER.info("@@@@@@@@@@@@@@@@@@@@@@@@" + logPrefix); return Mono.just(clientRequest); }); }
日志对比
logRequest()输出的前缀
2023-03-10T16:10:25.545+11:00 INFO 5616 --- [ctor-http-nio-3] com.foo.api.application.AppConfig : @@@@@@@@@@@@@@@@@@@@@@@@[2b7dbaa5]
此处前缀为2b7dbaa5。
HttpClient日志中的连接ID
2023-03-10T16:10:25.866+11:00 INFO 5616 --- [ctor-http-nio-3] reactor.netty.http.client.HttpClient : [add08934] REGISTERED 2023-03-10T16:10:25.952+11:00 INFO 5616 --- [ctor-http-nio-3] reactor.netty.http.client.HttpClient : [add08934] CONNECT: fooo/ 2023-03-10T16:10:26.277+11:00 INFO 5616 --- [ctor-http-nio-3] reactor.netty.http.client.HttpClient : [add08934, L:/192.168.18.244:5504 - R:fooo/] ACTIVE 2023-03-10T16:10:26.583+11:00 INFO 5616 --- [ctor-http-nio-3] reactor.netty.http.client.HttpClient : [add08934, L:/192.168.18.244:5504 - R:fooo/] READ COMPLETE 2023-03-10T16:10:26.962+11:00 INFO 5616 --- [ctor-http-nio-3] reactor.netty.http.client.HttpClient : [add08934, L:/192.168.18.244:5504 - R:foo/] USER_EVENT: SslHandshakeCompletionEvent(SUCCESS)
此处连接ID为add08934,和前者不匹配。
原因与解决方案
原因
clientRequest.logPrefix()生成的是请求级别的ID,而Reactor Netty HttpClient日志里的是连接级别的ID,两者属于不同维度的标识:
- 请求ID是Spring WebFlux为每个客户端请求生成的唯一标识,用于追踪单个请求的生命周期。
- 连接ID是Reactor Netty为TCP连接生成的标识,一个连接可能被多个请求复用(HTTP持久化连接场景),因此一个连接ID对应多个请求ID是正常现象。
解决方案
如果需要在日志中将请求ID和连接ID关联起来,可以通过以下方式实现:
- 自定义上下文传递:在WebClient的过滤器中,将请求ID存入
Mono的上下文,再通过Reactor Netty的doOnConnected钩子获取连接ID,绑定后输出日志。 - 使用Reactor Netty原生请求日志:关闭自定义的
logRequest过滤器,改用Reactor Netty原生日志配置,它会同时输出连接ID和请求信息,示例配置如下:
HttpClient.create() .wiretap("reactor.netty.http.client.HttpClient", LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL) .doOnConnected(conn -> conn.addHandlerLast(new LoggingHandler(LogLevel.INFO)) );
- 整合MDC日志上下文:在WebClient过滤器中将请求ID放入MDC,自定义Reactor Netty的日志格式,让HttpClient日志输出MDC中的请求ID,实现两者关联。
内容的提问来源于stack exchange,提问作者user2412398
相关产品推荐
相关产品推荐

