2016-11-02 127 views
2

任何人都考虑过如何处理日志中的超长超时?这对于Spring Boot来说是一个很大的麻烦,因为有很多自动生成的东西和抽象概念。Spring Boot中极长的例外日志

举例来说,如果我有一个模型类,并揭露它虽然@RepositoryRestResource + CrudRepository并在运行时打@NonNull或唯一约束 - 我会得到一个super long exception。认为应该采取某种方法来拦截它们在整个容器范围内,并实施一些更好的自定义日志记录或者可能准备使用某种解决方案。在此先感谢您的任何建议

PS。有一个similar question,但建议的解决方案似乎与现代的log4j-2版本没有关系

回答

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." 
}