防止在 Spring Boot 应用程序中对自定义异常进行堆栈跟踪日志记录

2022-09-01 04:04:41

有没有办法在Spring Boot(MVC)中记录自定义异常并抛出它,而不会在日志文件中显示其堆栈跟踪?但对于任何其他异常,仍请参阅堆栈跟踪。

详细解释:

我正在使用弹簧靴来创建一个简单的休息服务。我喜欢对于自定义异常,默认情况下日志中没有堆栈跟踪,并且使用基本的异常详细信息(状态,错误,消息)创建JSON响应。

问题是它也根本不创建任何日志条目,因此我必须手动执行此操作:

自定义例外

@ResponseStatus(value = HttpStatus.CONFLICT)
public class DuplicateFoundException extends RuntimeException {
    public DuplicateFoundException(String message) {
        super(message);
    }
}

服务方法中的异常引发(@RestController中)

if (!voteDao.findByItemAndUser(item, voteDto.getUserId()).isEmpty()) {
    log.warn("... already voted ...");   //TODO: don't do this for every throw
    throw new DuplicateFoundException("... already voted ...");
}

有更多的异常会导致在每次抛出之前放置日志语句,我认为这是一个不好的方法。我尝试从服务方法中删除所有日志语句,并创建了记录所有自定义异常并重新抛出它们的位置,以便我仍然像以前一样获得漂亮的JSON:@ControllerAdvice

@ControllerAdvice
public class RestExceptionHandler {
    private static final Logger log = Logger.getLogger(RestExceptionHandler.class);

    @ExceptionHandler
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
            log.warn(e.getMessage());
        } else {
            log.error("...");
        }
        throw e;
    }
}

现在的问题是,我不仅看到日志条目,还看到自定义异常的堆栈跟踪,并且找不到如何防止这种情况的方法。我认为问题是由再次投掷它引起的。一个可能的解决方案可能是为异常创建一个自定义类,我将返回它,但我不喜欢这个想法,因为异常编组似乎工作正常。

任何提示?


答案 1

我正在使用Spring Boot 2 +,只需将此行添加到您的应用程序中。

server.error.include-stacktrace=never

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/web/ErrorProperties.IncludeStacktrace.html


答案 2

警惕Spring Boot DevTools。

尽管是 的默认值,但如果您包含 Spring Boot DevTools,则它覆盖了 。NEVERserver.error.include-stacktraceALWAYS

如果您对更多详细信息感兴趣,请参阅此提交,它已成为Spring Boot 2.1.0 +的一部分enter image description here