【发布时间】:2020-08-03 19:06:09
【问题描述】:
对于我的 micronaut 服务器发出的任何 4xx 或 5xx 响应,我想记录响应状态代码和它所针对的端点。看起来过滤器是一个很好的地方,但我似乎无法弄清楚如何插入 onError 处理
例如,这个过滤器
@Filter("/**")
class RequestLoggerFilter: OncePerRequestHttpServerFilter() {
companion object {
private val log = LogManager.getLogger(RequestLoggerFilter::class.java)
}
override fun doFilterOnce(request: HttpRequest<*>, chain: ServerFilterChain): Publisher<MutableHttpResponse<*>>? {
return Publishers.then(chain.proceed(request), ResponseLogger(request))
}
class ResponseLogger(private val request: HttpRequest<*>): Consumer<MutableHttpResponse<*>> {
override fun accept(response: MutableHttpResponse<*>) {
log.info("Status: ${response.status.code} Endpoint: ${request.path}")
}
}
}
仅记录成功响应,而不记录 4xx 或 5xx 响应。 我如何让它与 onError 处理挂钩?
【问题讨论】:
-
你看过
@Error注解(docs.micronaut.io/2.0.1/guide/index.html#errorHandling)吗? -
我确实检查了错误注释,也许这就是要走的路。但是,如果我创建一个捕获异常的通用错误处理程序,那么似乎我失去了一些免费提供的不错的默认错误处理(比如 io.micronaut.core.convert.exceptions.ConversionErrorException 被变成了一个错误的请求)。有没有办法让通用错误处理程序执行一些日志记录,然后将行为传递给通常会发生的情况?
:我想我真正想要的是进行常规错误处理,然后将最终结果 - 400 记录到 /path