我有一个 Spring Boot 应用程序,这是一个通过 WebClient 调用外部系统的反应式服务。我还有一些非反应性服务。已经使用
MDC
+ Logbook
为 Feign
客户端实现了日志记录。非常希望重用现有的类,或者至少使日志记录看起来与非响应式服务日志相同。
RESPONSE_CODE=200, RESPONSE_HEADERS=[transfer-encoding:"chunked"], METHOD=POST, REQUEST_QUERY={}, REQUEST_BODY=FluxMap, RESPONSE_BODY=, REQUEST_PATH=/ping, REQUEST_HEADERS=[Session:"11111abcd", Content-Type:"application/json", ..., Content-Length:"37"], TYPE=INREQ
当前日志看起来像这样。有问题的部分是
REQUEST_BODY=FluxMap
和 RESPONSE_BODY=
我设法在 WebClient 上使用
wiretap()
记录正文,但它不可自定义,因此不适合。
作为参考,我使用了这篇文章中的示例代码 我在这个 Github discussion
中找到了它我尝试了不同的方法:使用
ExchangeFilterFunction
和 WebFilter
+ ServerHttpRequestDecorator
(和其他装饰器),我尝试从 DataBuffer
获取主体。还是没有运气。
对我有用的解决方案:
<dependency> <groupId>org.zalando</groupId> <artifactId>logbook-spring-boot-webflux-autoconfigure</artifactId> </dependency>
Logbook
时传递
WebClient
private WebClient getWebClient(Logbook logbook) { HttpClient httpClient = HttpClient.create() .doOnConnected(connection -> { connection.addHandlerLast(new LogbookClientHandler(logbook)); }); return WebClient.builder() .baseUrl(myUrl) .clientConnector(new ReactorClientHttpConnector(httpClient)) .build(); }
它确实有效,但部分有效。 交换WebClient实际上开始记录。 但MDC也存在问题。 MDC 上下文未传递。 我正在寻找摆脱这种情况的方法。