【Java项目】Spring-全局异常+钉钉推送(实现生产问题监控)

【Java项目】Spring-全局异常+钉钉推送(实现生产问题监控)
概述
生产环境的线上问题,通常出现时都比较紧急,由于开发人员不能直接debug生产环境,通常处理起来不是很容易。因此,生产环境出问题时,如果能够将报错的接口和参数,推送到钉钉群,就可以帮助技术人员快速排查生产问题,避免对业务影响,出现生产事故。
这里结合Spring 全局异常和钉钉推送,介绍如何实现生产问题监控。
全局异常
Spring全局异常主要使用@ControllerAdvice 注解和@ExceptionHandler注解
@ControllerAdvice
该注解作用是给Controller控制器添加统一的操作或处理,结合@ExceptionHandler用于全局异常的处理,也可以使用@RestControllerAdvice以文本返回到浏览器,实际中该注解还有很多用途,这里不做深究,感兴趣可以下来了解;
@ExceptionHandler
- 用来统一处理方法抛出的异常;
- +ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常;
@ExceptionHandler(NumberFormatException.class) public String handleExeption(Exception ex) { System.out.println("抛异常了:" + ex); ex.printStackTrace(); String resultStr = "异常:NumberFormatException"; return resultStr; }
此时注解的参数是NumberFormatException.class,表示只有方法抛出NumberFormatException时,才会调用该方法。
- 如果是通过try catch处理了异常,将不会进入到全局异常处理类,必须是通过运行时抛出的异常或者是通过throw new 加对应的异常,才会进入@ExceptionHandler 拦截。
配置过滤器
过滤器的作用,就是把httpServeletRequest包装成ContentCachingRequestWrapper类型继续往下传。
@Component public class RequestCachingFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { filterChain.doFilter(new ContentCachingRequestWrapper(httpServletRequest), httpServletResponse); } }
第二步就是在使用的使用用方法getContentAsByteArray获取入参值:
if(req != null && req instanceof ContentCachingRequestWrapper){ ContentCachingRequestWrapper wrapper =(ContentCachingRequestWrapper) req; log.error("request_body:{}", StringUtils.toEncodedString(wrapper.getContentAsByteArray(), Charset.forName(wrapper.getCharacterEncoding())) ); }
这样你就获取到来自客户端请求的入参。注意inputStream只能读一次流就会被关闭,不会再被读取,所以如果在序列化等过程中读过一次inputStream,之后就不要尝试自己再读,会抛异常,无法读取数据。
参考: https://blog.csdn.net/weixin_41953346/article/details/127882004
钉钉群消息推送
详细的钉钉推送API可以参考地址:https://open.dingtalk.com/document/orgapp/custom-robot-access
钉钉群配置


总结
1、使用Spring 全局异常,可以对代码异常信息进行统一拦截;
2、使用钉钉推送,将异常信息及时推送到技术人员群里,及时反馈;
3、技术人员通过报错信息,监控生产环境,也可以帮助高效解决问题。
示例代码github地址:
https://github.com/zhcyixin/zhc-java.git
欢迎大家下载,有问题可以在评论区交流。