有人考虑过如何处理日志中的超长异常吗?这将成为Spring的一大难题,因为在业务流程的基础上有很多自动生成的东西和抽象。
例如,如果我有一个模型类,并通过@RepositoryRestResource + CrudRepository公开它,并在运行时按下@NonNull或唯一约束,我将得到一个超长例外。认为应该有某种方法来拦截它们,在容器范围内实现一些更好的定制日志记录,或者可能有一些已经准备好使用的解决方案。谢谢您的建议
PS。有一个相似问题,但建议的解决方案似乎与现代log4j-2版本无关。
发布于 2016-11-02 06:35:58
我想出的一个解决方案是针对来自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."
}https://stackoverflow.com/questions/40372608
复制相似问题