如何自定义ResponseStatusExceptionResolver日志,仅屏蔽特定异常控制台日志?
解决Spring Boot指定异常不记录日志的问题
要实现只排除EntityNotFoundException的日志记录,同时保留AccessDeniedException等其他异常的日志,有两种可行方案:
方案一:自定义异常解析器
继承Spring的ResponseStatusExceptionResolver,重写日志记录逻辑,只对特定异常跳过日志:
- 创建自定义异常解析器类
import org.springframework.web.servlet.mvc.method.annotation.ResponseStatusExceptionResolver; import javax.servlet.http.HttpServletRequest; import com.yourproject.exception.EntityNotFoundException; // 替换为你的异常类实际路径 import org.springframework.security.access.AccessDeniedException; public class SelectiveLogExceptionResolver extends ResponseStatusExceptionResolver { @Override protected void logException(Exception ex, HttpServletRequest request) { // 仅当异常不是EntityNotFoundException时,才调用父类的日志记录逻辑 if (!(ex instanceof EntityNotFoundException)) { super.logException(ex, request); } // EntityNotFoundException会被跳过,不记录日志 } }
- 注册该解析器为Spring Bean
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WebMvcConfig { @Bean public SelectiveLogExceptionResolver selectiveLogExceptionResolver() { return new SelectiveLogExceptionResolver(); } }
这种方式优势是逻辑灵活,能精确控制哪些异常需要日志,适合需要自定义更多规则的场景。
方案二:通过日志框架过滤(以Logback为例)
直接在日志配置中针对ResponseStatusExceptionResolver类过滤掉EntityNotFoundException的日志:
在logback.xml或logback-spring.xml中添加如下配置:
<logger name="org.springframework.web.servlet.mvc.method.annotation.ResponseStatusExceptionResolver" level="INFO"> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <!-- 替换为你实际的EntityNotFoundException全类名 --> <expression>return !(throwable instanceof com.yourproject.exception.EntityNotFoundException);</expression> </evaluator> <OnMismatch>DENY</OnMismatch> <OnMatch>ACCEPT</OnMatch> </filter> </logger>
该方案无需修改业务代码,配置简单,适合仅需过滤特定异常日志的场景。
注意事项
- 确保配置中异常类的全类名与实际项目一致,如果是Spring自带的异常(比如Spring Data的
ResourceNotFoundException),要替换对应包路径。 - 若使用Log4j2,可对应调整日志过滤规则,逻辑类似。
内容的提问来源于stack exchange,提问作者IceMajor
相关产品推荐
相关产品推荐

