首页 > 解决方案 > 在 Spring Boot 中从 HttpServletRequest 获取堆栈跟踪

问题描述

我目前正在运行一个弹簧启动应用程序。

我将这个网页上线供多人使用。然而,这是第一次启动它,我不确定我是否已经解决了所有的错误,所以我试图找到一种方法来提醒自己当有事情发生时。

我在 Spring 中创建了一个自定义错误控制器。我希望它显示一个自定义错误页面,它只是简单地告诉用户出现问题并且我们已经意识到它。这部分已经开始工作了。

此外,我希望它向我发送一封包含堆栈跟踪信息的电子邮件。我希望通过电子邮件将默认错误控制器显示的同一页面发送给我。我正在使用 AWS SES。

这是我的代码示例。

@GetMapping("/error")
public String handleError(HttpServletRequest request) {
    Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

    if (status != null) {
        int statusCode = Integer.parseInt(status.toString());

        if(statusCode == HttpStatus.NOT_FOUND.value()) {
            return "404";
        }
    }
    
    sesSender.sendErrorEmail("strack trace error");
    return "error";
}

我发现 5 年前提供的以下问题Spring Boot Custom Error Page Stack Trace 我希望从那时起,他们就允许使用此功能。

标签: spring-booterror-handlingstack-trace

解决方案


如果你使用 Spring Boot,你可以使用这个 bean 和这个方法 ExceptionUtils.getStackTrace()。您将需要导入 commons.lang 依赖项。ExceptionUtils 中的方法将为您提供要发送到电子邮件的堆栈跟踪。但这仅适用于服务器端错误。如果您希望发送带有前端错误堆栈跟踪的电子邮件,您需要创建自己的 Dispatcher Servlet 并在 DoService 过滤器中处理它

@Bean
HandlerExceptionResolver errorHandler() {
    return (request, response, handler, ex) -> {
        Logger logger = LoggerFactory.getLogger(DispatcherServlet.class);
        ModelAndView model = new ModelAndView("error/error");
        model.addObject("exceptionType", ex);
        model.addObject("handlerMethod", handler);

        logger.error(ExceptionUtils.getMessage(ex));
        System.out.println("" +
                "\n" + ExceptionUtils.getStackTrace(ex));

        try {
            Utility.sendStackTraceToDeveloper(ex, request, javaMailSender);
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return model;
    };
}

推荐阅读