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,提问作者夢のの夢
相关产品推荐
相关产品推荐

