如何创建不将 WARN 消息记录到日志中的 Spring @ExceptionHandler 方法

2022-09-02 01:46:02

我有一个带有弹簧的Spring Boot应用程序,它主要做我想做的事情。它将 HTTP 状态代码设置为 409,并在 JSON 响应中包含额外的错误信息。@ExceptionHandler

@ExceptionHandler(PolicyExecutionException.class)
public ResponseEntity handleException(PolicyExecutionException se){
    return ResponseEntity.status(HttpStatus.CONFLICT).body(se.getScriptErrorMap());
}

我注意到的是,即使它向客户端提供了正确的响应,Spring也在WARN级别记录一条消息。我的信息很长,只与客户有关。我宁愿不在服务器端记录它。这可以关闭吗?

2017-06-19 18:48:10,659 [p-nio-8060-exec-2] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - 由处理程序执行引起的已解决异常:

我使用的一种替代方法是在每个控制器方法上捕获可以抛出它的方法。这导致额外的样板,如果可能的话,我宁愿避免。PolicyExecutionException


答案 1

摘要HandlerExceptionResolver 是 的超类型,它维护一个用于在解决异常时记录该消息的参数,由 setWarnLogCategory 控制。ExceptionHandlerExceptionResolverwarnLogger

默认值为无警告日志记录。指定此设置以激活警告登录到特定类别。或者,重写自定义日志记录的方法。logException(java.lang.Exception, javax.servlet.http.HttpServletRequest)

当您创建您的(或通过默认配置为您创建时),它会设置为不使用。ExceptionHandlerExceptionResolvernull

使用Spring Boot,您可以控制它是否通过

spring.mvc.logResolvedException

应用程序属性。这将控制 WebMvcProperties 中的相应值。(默认情况下,您必须在配置中将其设置为,或者已显式调用。falsetruesetWarnLogCategory


或者,关闭记录器。


答案 2

推荐