Как можно записывать содержимое ошибочных HTTP ответов в логи?

  • 11 сентября 2023 г. 7:16
Ответы на вопрос 2
Вы можете настроить логирование тела ошибок в формате JSON, используя интерфейс `ExchangeFilterFunction` в Spring WebClient.

Вот пример реализации `ExchangeFilterFunction` для записи содержимого ошибок в логи:

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.BodyExtractor;
import org.springframework.web.reactive.function.BodyExtractors;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;

import reactor.core.publisher.Mono;

public class LoggingExchangeFilterFunction implements ExchangeFilterFunction {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingExchangeFilterFunction.class);

    @Override
    public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
        return next.exchange(request)
                .flatMap(response -> {
                    HttpStatus status = response.statusCode();
                    BodyExtractor<Mono<String>, ReactiveHttpInputMessage> bodyExtractor;

                    if (status.is4xxClientError() || status.is5xxServerError()) {
                        bodyExtractor = BodyExtractors.toMono(String.class);
                    } else {
                        bodyExtractor = BodyExtractors.empty();
                    }

                    return response.body(bodyExtractor)
                            .flatMap(body -> {
                                LOGGER.error("Error response status: {}, body: {}", status.value(), body);
                                return Mono.just(response);
                            });
                });
    }
}
```

Затем нужно зарегистрировать `LoggingExchangeFilterFunction` в WebClient:

```java
private WebClient webClient = WebClient.builder()
        .baseUrl("https://партнерский-api-url")
        .filter(new LoggingExchangeFilterFunction())
        .build();
```

Теперь, при выполнении запросов через WebClient, содержимое ошибок будет записываться в логи в формате JSON.
Попробуйте использовать метод .log() после метода .retrieve().
Похожие вопросы