Почему журналирование тела запроса не включает сериализованные данные запроса? Как я могу настроить свое приложение для регистрации полной информации о теле запроса?
Я пытаюсь зарегистрировать тело запроса, отправленное через WebClient, в моем приложении Spring WebFlux. Я настроил средство ведения журнала и веб-клиент, как показано ниже, но в журнале отображается только минимальная информация о запросе. Вот моя текущая конфигурация и наблюдаемое поведение
Конфигурация Конфигурация веб-клиента
Код: Выделить всё
@Bean
public WebClient webClient() {
// Memory buffer configuration
ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder()
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(1024 * 1024 * 50))
.build();
// Enable logging request details
exchangeStrategies.messageWriters().stream()
.filter(LoggingCodecSupport.class::isInstance)
.forEach(writer -> ((LoggingCodecSupport) writer).setEnableLoggingRequestDetails(true));
ConnectionProvider provider = ConnectionProvider.builder("provider")
.maxConnections(100)
.maxIdleTime(Duration.ofSeconds(30))
.maxLifeTime(Duration.ofSeconds(30))
.pendingAcquireTimeout(Duration.ofSeconds(60))
.pendingAcquireMaxCount(-1)
.evictInBackground(Duration.ofSeconds(30))
.lifo()
.build();
HttpClient httpClient = HttpClient.create(provider)
.wiretap("reactor.netty.http.client.HttpClient", LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000)
.responseTimeout(Duration.ofSeconds(60))
.doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(30, TimeUnit.SECONDS))
.addHandlerLast(new WriteTimeoutHandler(30, TimeUnit.SECONDS)));
return WebClient.builder()
.defaultHeader("Accept", MediaType.APPLICATION_JSON_VALUE)
.defaultHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE)
.clientConnector(new ReactorClientHttpConnector(httpClient))
.exchangeStrategies(exchangeStrategies)
.build();
}
Код: Выделить всё
Код: Выделить всё
public void sendRequest() {
Map requestBody = Map.of("name", "example", "value", 123);
String response = webClient.post()
.uri("http://localhost:8080/v1/web-client/server-post")
.bodyValue(requestBody)
.retrieve()
.bodyToMono(String.class)
.block();
System.out.println("Response: " + response);
}
Код: Выделить всё
2025-01-15 19:08:17.108 TRACE 64787 --- [http-nio-8080-exec-5] o.s.w.r.f.client.ExchangeFunctions : [2d080393] HTTP POST http://localhost:8080/v1/web-client/server-post, headers=[Accept:"application/json, application/xml", Content-Type:"application/json"]
Код: Выделить всё
[TRACE] org.springframework.web.reactive.function.client.ExchangeFunctions - [Request transformation] Transforming request body to serialized format.
[DEBUG] org.springframework.web.reactive.function.client.ExchangeFunctions - Request Body: {"name":"example","value":123}
- Версия Spring Boot: 3.3
- Версия Java: 17
- Reactor Netty: версия по умолчанию, предоставляемая зависимостями Spring Boot.
- Logging Framework: настройка ведения журнала по умолчанию в Spring Boot (Logback).
- Проверено, что для средства ведения журнала для org.springframework.web.reactive.function.client.ExchangeFunctions установлено значение TRACE .
Код: Выделить всё
- Поэкспериментировал с изменением уровня журнала на INFO.
- Я попробовал полностью удалить конфигурацию прослушивания, чтобы посмотрите, не противоречит ли это настройке ведения журнала Spring.
Код: Выделить всё
.wiretap("reactor.netty.http.client.HttpClient", LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL)
- Удалена функция прослушивания
Подробнее здесь: https://stackoverflow.com/questions/793 ... dy-details