Spring Boot中的异常日志非常长

时间:2016-11-02 04:40:44

标签: spring logging spring-boot exception-handling spring-data

有人考虑过如何处理日志中的超长异常?这对Spring Boot来说是一个巨大的痛苦,因为在abstration之上有很多自动生成的东西和抽象。

例如,如果我有一个模型类并通过@RepositoryRestResource + CrudRepository公开它并在运行时点击@NonNull或唯一约束 - 我会得到一个super long exception 。认为应该有一些方法可以在容器范围内拦截它们并实现一些更好的自定义日志记录或者可能是一些准备使用的解决方案。提前感谢任何建议

PS 即可。有similar question,但建议的解决方案似乎与现代log4j-2版本无关

1 个答案:

答案 0 :(得分:0)

我提出的一个解决方案是针对Spring控制器的异常,这对于很多场景来说已经足够了。

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler
{
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    @ExceptionHandler({RollbackException.class, DataIntegrityViolationException.class})
    public @ResponseBody
    Map<String,Object> allRollbacks
    (
        Exception exception,
        HttpServletRequest request,
        HttpServletResponse response
    )
    {
        HashMap<String, Object> result = new HashMap<>();
        result.put("error", HttpStatus.BAD_REQUEST.name());

        Throwable exceptionToLog = Throwables.getRootCause(exception);
        String exceptionClassName = exceptionToLog.getClass().getCanonicalName();
        String message = exceptionToLog.getMessage();

        log.info("{}: {}", exceptionClassName, message);

        result.put("exception", exceptionClassName);
        result.put("message", message);

        return result;
    }
}

在这种情况下,我们将在来自截取者的日志中看到一个简短的根本原因消息,客户端将收到类似的JSON响应:

{
 "exception": "org.postgresql.util.PSQLException",
 "error": "BAD_REQUEST",
 "message": "ERROR: duplicate key value violates unique constraint \"ukr6y7o33kjy3vispmnl7if5d4s\"\n  Detail: Key (ref1_id, ref2_id, ref3_id)=(8325842b-ee40-48c3-ab6b-5b914e70b583, 9b0f5356-baa8-4ae2-a149-4f7b1f2dbfda, 9281369c-10a6-4649-bcd3-c18d2e5cd287) already exists."
}