在全局异常处理类中增加日志

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 个微服务工程中的异常处理类的代码修改与此类似,就不再给出代码了。