我希望在使用Kotlin的Spring WebFlux REST API中拥有请求和响应的集中式日志记录。到目前为止,我尝试了以下方法:
@Bean
fun apiRouter() = router {
(accept(MediaType.APPLICATION_JSON) and "/api").nest {
"/user".nest {
GET("/", userHandler::listUsers)
POST("/{userId}", userHandler::updateUser)
}
}
}.filter { request, next ->
logger.info { "Processing request $request with body ${request.bodyToMono<String>()}" }
next.handle(request).doOnSuccess { logger.info { "Handling with response $it" } }
}
这里请求方法和路径日志已经成功,但是内容是 Mono
,我该如何记录它呢?是不是要反过来,在请求体 Mono
上订阅并在回调函数中记录?还有一个问题是这里的 ServerResponse
接口没有访问响应体的权限。我如何在这里获取它?
另一种尝试是使用 WebFilter
。
@Bean
fun loggingFilter(): WebFilter =
WebFilter { exchange, chain ->
val request = exchange.request
logger.info { "Processing request method=${request.method} path=${request.path.pathWithinApplication()} params=[${request.queryParams}] body=[${request.body}]" }
val result = chain.filter(exchange)
logger.info { "Handling with response ${exchange.response}" }
return@WebFilter result
}
我也遇到了同样的问题:请求体是Flux
,但没有响应体。
有没有一种方法可以从某些过滤器中访问完整的请求和响应以进行日志记录?我理解错了什么吗?