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

Spring WebClient如何以INFO级别记录每次重试的日志

解决方案

你可以通过以下两个调整实现需求,两个方案可以单独使用也可以搭配使用:

两个方案同时使用时,既可以明确看到重试触发的时机和次数,也能打印每次请求的完整参数信息,完全匹配你需要的日志效果。

方案1:给Retry逻辑添加自定义触发日志

原来的retry(2L)是无回调的简化写法,替换为带钩子的Retry配置即可在每次重试触发时打印INFO日志,修改后的调用代码如下:

// 首先导入依赖:reactor.util.retry.Retry
Response response = requestBodySpec
        .retrieve()
        .bodyToMono(Response.class)
        .timeout(Duration.ofSeconds(5))
        // 替换原有retry(2L)配置
        .retryWhen(Retry.max(2)
                // 每次重试触发前执行回调
                .doBeforeRetry(retrySignal -> {
                    log.info("触发第{}次重试,异常原因:{}", 
                            retrySignal.totalRetries() + 1,
                            retrySignal.failure().toString());
                })
        )
        .doOnSuccess(res -> log.info("请求成功,响应:{}", res))
        .doOnError(err -> log.error("请求最终失败,异常:", err))
        .block();

该方式可以自定义重试日志的格式、内容,明确标注重试次数和触发原因。

方案2:给WebClient添加全局请求INFO日志过滤器

如果需要和原TRACE级别完全一致的请求日志(包含请求方法、URL、头信息等),可以直接修改WebClient的配置,添加请求日志过滤器,所有请求(包括首次和重试发起的请求)都会输出INFO级别的日志:

@Configuration
class WebClientConfig {
    private static final Logger log = LoggerFactory.getLogger(WebClientConfig.class);
    
    @Bean
    public WebClient webClientBean() {
        return WebClient.builder()
                .baseUrl("http://localhost:8090")
                // 添加请求日志过滤器
                .filter((request, next) -> {
                    log.info("HTTP {} {}, headers={}", 
                            request.method(), 
                            request.url(), 
                            request.headers());
                    // 如果需要隐藏敏感头信息,可自行过滤headers输出内容,和原有TRACE日志的masked效果保持一致
                    return next.exchange(request);
                })
                .build();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:06:04