在全局异常处理类中增加日志
Sleuth
及后续的 ELK
日志中心都与日志信息相关,因此除基础的整合外,在项目的一些类中也要加上日志输出的代码。在这里,笔者主要在全局异常处理类中增加报错信息的日志输出,代码如下。
GoodsServiceExceptionHandler
类中增加的报错信息的日志输出:
@RestControllerAdvice
public class GoodsServiceExceptionHandler {
// 声明日志对象
private static final Logger log = LoggerFactory.getLogger(GoodsServiceExceptionHandler.class);
@ExceptionHandler(BindException.class)
public Object bindException(BindException e) {
// 输出异常信息,日志级别为 error
log.error("GoodsServiceExceptionHandler:", e);
Result result = new Result();
result.setResultCode(510);
BindingResult bindingResult = e.getBindingResult();
result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
return result;
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object bindException(MethodArgumentNotValidException e) {
// 输出异常信息,日志级别为 error
log.error("GoodsServiceExceptionHandler:", e);
Result result = new Result();
result.setResultCode(510);
BindingResult bindingResult = e.getBindingResult();
result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
return result;
}
@ExceptionHandler(Exception.class)
public Object handleException(Exception e, HttpServletRequest req) {
// 输出异常信息,日志级别为 error
log.error("GoodsServiceExceptionHandler:", e);
Result result = new Result();
result.setResultCode(500);
// 区分是否为自定义异常
if (e instanceof NewBeeMallException) {
result.setMessage(e.getMessage());
if (e.getMessage().equals(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.ADMIN_TOKEN_EXPIRE_ERROR.getResult())) {
result.setResultCode(419);
}
if (e.getMessage().equals(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult())) {
result.setResultCode(416);
} else {
e.printStackTrace();
result.setMessage("未知异常,请查看控制台日志并检查配置文件。");
}
}
return result;
}
}
java
ShopCartServiceExceptionHandler
类中增加的报错信息的日志输出:
@RestControllerAdvice
public class ShopCartServiceExceptionHandler {
// 声明日志对象
private static final Logger log = LoggerFactory.getLogger(ShopCartServiceExceptionHandler.class);
@ExceptionHandler(BindException.class)
public Object bindException(BindException e) {
// 输出异常信息,且日志级别为 error
log.error("ShopCartServiceExceptionHandler:",e);
Result result = new Result();
result.setResultCode(510);
BindingResult bindingResult = e.getBindingResult();
result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
return result;
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object bindException(MethodArgumentNotValidException e) {
// 输出异常信息,日志级别为 error
log.error("ShoppingCartServiceExceptionHandler:",e);
Result result = new Result();
result.setResultCode(510);
BindingResult bindingResult = e.getBindingResult();
result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
return result;
}
@ExceptionHandler(Exception.class)
public Object handleException(Exception e, HttpServletRequest req) {
// 输出异常信息,日志级别为 error
log.error("ShoppingCartServiceExceptionHandler:",e);
Result result = new Result();
result.setResultCode(500);
// 区分是否为自定义异常
if (e instanceof NewBeeMallException) {
result.setMessage(e.getMessage());
}
if (e.getMessage().equals(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult())) {
result.setResultCode(416);
} else {
e.printStackTrace();
result.setMessage("未知异常,请查看控制台日志并检查配置文件。");
}
return result;
}
}
java
在代码中主要修改了声明的日志对象,并且输出 error
级别的日志。其余 3 个微服务工程中的异常处理类的代码修改与此类似,就不再给出代码了。