2016-11-02 72 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." 
}