我有一个Spring Cloud Gateway服务位于许多后端服务的前面,但是目前它记录的不是很多。每当后台服务返回意外的响应状态代码时,我都想记录它们的响应,但是我遇到了以下问题。
我可以使用ModifyResponseBody过滤器和RewriteFunction记录请求的响应主体,如下所示:
.route("test2") {r ->
r.path("/httpbin2/**")
.filters { f ->
f.filter(LogUnexpectedResponseFilter()
.apply(LogUnexpectedResponseFilter.Config(listOf(HttpStatus.OK))))
}.uri("http://httpbin.org")
}
这种方法的问题在于,即使我只是在这些响应的一小部分上使用主体字符串,也要在每个响应上将响应ByteArray解析为一个字符串,这暗示了开销。
我尝试改为实施自定义过滤器,如下所示:
class LogUnexpectedResponseFilter : AbstractGatewayFilterFactory<LogUnexpectedResponseFilter.Config>() {
val logger = LoggerFactory.getLogger(this::class.java)
override fun apply(config: Config?): GatewayFilter {
return GatewayFilter { exchange, chain ->
logger.info("running custom filter")
if (config?.errors!!.contains(exchange.response.statusCode)){
return@GatewayFilter ModifyResponseBodyGatewayFilterFactory().apply(ModifyResponseBodyGatewayFilterFactory.Config()
.setInClass(String::class.java)
.setOutClass(String::class.java)
.setRewriteFunction(String::class.java, String::class.java) { _, body ->
logger.error(body)
Mono.just(body)
}).filter(exchange, chain)
} else {
chain.filter(exchange)
}
}
}
data class Config(val errors: List<HttpStatus>)
}
{{1}}
该应该要做的只是让请求通过大多数请求,但是将日志过滤器应用于我配置了它的那些(尽管在此示例中,我将其记录为日志)在200个状态响应中)。
我在调试时看到的是它正确地应用了正确的过滤器,但是里面的RewriteFunction根本没有运行。我想念什么?