Java Spring Boot框架中的WebClient是一个用于发送HTTP请求的非阻塞客户端库。它提供了一种简单且灵活的方式来执行各种HTTP操作,如GET、POST、PUT、DELETE等,并且支持异步处理响应。
日志记录是一种重要的调试和排查问题的手段。在WebClient中,可以通过设置ExchangeFilterFunction来实现日志记录功能。ExchangeFilterFunction是一个函数接口,它可以在发送请求和接收响应的过程中拦截并处理请求和响应。
要记录4xx/5xx主体响应日志,可以在ExchangeFilterFunction中检查响应状态码,并将相应的响应体以及其他相关信息记录下来。以下是一个示例代码:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
import org.springframework.web.reactive.function.client.ExchangeFunction;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Component
public class WebClientLogger {
private static final Logger logger = LoggerFactory.getLogger(WebClientLogger.class);
public WebClient createWebClientWithLogging() {
ExchangeStrategies strategies = ExchangeStrategies.builder()
.codecs(configurer -> configurer
.defaultCodecs()
.maxInMemorySize(16 * 1024 * 1024)) // 设置请求和响应的最大内存大小
.build();
return WebClient.builder()
.exchangeStrategies(strategies)
.filter(logRequest())
.build();
}
private ExchangeFilterFunction logRequest() {
return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
logRequestDetails(clientRequest);
return Mono.just(clientRequest);
});
}
private void logRequestDetails(ClientRequest clientRequest) {
logger.info("Sending request: {} {}", clientRequest.method(), clientRequest.url());
clientRequest.headers().forEach((name, values) -> values.forEach(value -> logger.info("{}: {}", name, value)));
}
}
上述代码中,WebClientLogger类通过createWebClientWithLogging方法创建带有日志记录功能的WebClient实例。ExchangeStrategies用于配置请求和响应的编解码策略,其中maxInMemorySize方法设置了请求和响应的最大内存大小。
logRequest方法返回一个ExchangeFilterFunction,它拦截并记录请求的详细信息。在logRequestDetails方法中,可以根据需求自定义日志输出的格式和内容。
使用示例:
WebClientLogger webClientLogger = new WebClientLogger();
WebClient webClient = webClientLogger.createWebClientWithLogging();
webClient.get()
.uri("https://example.com/api/endpoint")
.retrieve()
.bodyToMono(String.class)
.subscribe(responseBody -> logger.info("Response body: {}", responseBody));
在以上示例中,通过createWebClientWithLogging方法创建带有日志记录功能的WebClient实例。然后,使用该实例发送GET请求,并将响应体转换为字符串进行处理。
对于4xx/5xx主体响应,可以在logRequest方法中添加相应的处理逻辑,例如:
private ExchangeFilterFunction logRequest() {
return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
logResponseDetails(clientResponse);
return Mono.just(clientResponse);
});
}
private void logResponseDetails(ClientResponse clientResponse) {
HttpStatus statusCode = clientResponse.statusCode();
if (statusCode.is4xxClientError() || statusCode.is5xxServerError()) {
clientResponse.bodyToMono(String.class)
.subscribe(responseBody -> {
logger.error("Error response ({}): {}", statusCode.value(), responseBody);
});
}
}
在以上代码中,通过ofResponseProcessor方法拦截并记录响应的详细信息。在logResponseDetails方法中,检查响应的状态码是否为4xx/5xx,如果是,则将响应体记录为错误日志。
注意:在实际应用中,应根据具体需求和安全性考虑,对日志的输出级别、内容和格式进行适当配置和保护。
推荐的腾讯云相关产品:云函数(Serverless Cloud Function)和云原生应用平台(Tencent Kubernetes Engine,TKE)。