Spring MVC ResponseStatusExceptionResolver自定义日志记录

rjzwgtxy  于 2023-10-24  发布在  Spring
关注(0)|答案(1)|浏览(117)

每当我向我的API发出某种请求时,Sping Boot 就会记录异常,如果它们被抛出的话。
例如,当我发出一个请求GET /api/entity/100,并且没有id为100的实体时,那么在服务层中,我将抛出一个带有一些消息和HTTP代码的异常EntityNotFoundException
问题是,我不希望它记录在控制台,因为它很快使它看起来像垃圾和垃圾邮件。日志将看起来像这样:WARN 15512 --- [nio-8433-exec-3] .w.s.m.a.ResponseStatusExceptionResolver : Resolved [com.demo.mydomain.exceptions.classes.entity.EntityNotFoundException: Unable to find entity of '100' id]
显然,我可以通过添加spring.mvc.log-resolved-exception=false属性来禁用它。然而,这将禁用ResponseStatusExceptionResolver的所有日志,我希望保留一些其他异常的日志记录,如AccessDeniedException

g2ieeal7

g2ieeal71#

您可以创建自己的解析器,扩展ResponseStatusExceptionResolver并覆盖其logException()。如果异常是您不想记录的异常,则返回它。类似于:

public class MyResponseStatusExceptionResolver extends ResponseStatusExceptionResolver {

    @Override
    protected void logException(Exception ex, HttpServletRequest request) {
        if (ex instanceof EntityNotFoundException) {
            return;
        }
        super.logException(ex, request);
    }
}

然后配置使用它:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private ApplicationContext context;

    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        var myResolver = new MyResponseStatusExceptionResolver();
        myResolver.setMessageSource(context);
        myResolver.setWarnLogCategory(myResolver.getClass().getName());
        resolvers.add(0, myResponseStatusExceptionResolver);
    }
}

这个想法是你把这个定制的异常解析器放在默认异常解析器列表的第一个位置,这样它就总是在默认的ResponseStatusExceptionResolver之前使用它来解决异常。
请注意,您必须将自定义异常解决程序的日志记录级别设置为WARN,以便获得您想要的异常日志记录行为。

相关问题