spring-boot - 在 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 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;
};
}
推荐阅读
- c++ - 具有两种以上类型的 C++ 条件 typedef
- sql - SQL获取销售额超过一定数量的商品数量
- python - 对 memcache 将 AppEngine py2.7 应用程序迁移到 py3 感到困惑
- facebook - 从 fb.watch 别名获取 Facebook 视频 ID
- java - Java.lang.RuntimeException:在注册表中找不到应用程序“org.eclipse.test.coretestapplication”
- node.js - 使用 exceljs 并在解析大型 excel 文件时遇到内存泄漏
- javascript - ServiceNow 中的 JavaScript
- python-3.x - 来自 psycopg2 的 ExecuteMany 函数出错
- python - 如何根据具有重复值的列对熊猫中的值进行排序
- python - Selenium Python 单击没有 ID 的按钮