You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,两者属于不同维度的标识:

  1. 请求ID是Spring WebFlux为每个客户端请求生成的唯一标识,用于追踪单个请求的生命周期。
  2. 连接ID是Reactor Netty为TCP连接生成的标识,一个连接可能被多个请求复用(HTTP持久化连接场景),因此一个连接ID对应多个请求ID是正常现象。

解决方案

如果需要在日志中将请求ID和连接ID关联起来,可以通过以下方式实现:

  1. 自定义上下文传递:在WebClient的过滤器中,将请求ID存入Mono的上下文,再通过Reactor Netty的doOnConnected钩子获取连接ID,绑定后输出日志。
  2. 使用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))
        );
  1. 整合MDC日志上下文:在WebClient过滤器中将请求ID放入MDC,自定义Reactor Netty的日志格式,让HttpClient日志输出MDC中的请求ID,实现两者关联。

内容的提问来源于stack exchange,提问作者user2412398

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:00:27