java生产环境异常告警应通过@controlleradvice全局拦截,统一调用邮件或钉钉api通知;需截取关键堆栈、添加traceid、控制频率与重试,并配置开关支持灰度降级。
java应用在生产环境中发生异常时,需要及时通知开发或运维人员。实现自动告警的关键是:捕获异常 + 构建通知逻辑 + 集成邮件或钉钉api。不建议在每个try-catch里重复写发送逻辑,应统一拦截、统一处理。
统一异常拦截(Spring Boot推荐)
使用@ControllerAdvice + @ExceptionHandler全局捕获未处理异常,避免散落在各处:
- 定义一个全局异常处理器类,添加@ControllerAdvice注解
- 用@ExceptionHandler(Exception.class)捕获所有非特定异常
- 在方法内记录日志、提取堆栈、构造告警内容
- 调用封装好的通知服务(如EmailService.sendAlert()或DingTalkService.send())
集成邮件告警(基于JavaMailSender)
Spring Boot项目可直接引入spring-boot-starter-mail,配置SMTP参数后即可发送:
- application.yml中配置邮箱服务器(如QQ邮箱需开启SMTP并填授权码)
- 注入JavaMailSender,构建SimpleMailMessage或MimeMessage
- 邮件主题建议包含环境标识(如【PROD】)、服务名、异常类型;正文至少含时间、请求路径、异常类名、简要堆栈前10行
- 注意:不要在邮件正文中直接输出完整堆栈(可能超长或含敏感信息),可截取关键部分或转存至日志系统后附链接
集成钉钉机器人通知(Webhook方式)
钉钉群自建机器人最轻量,只需一个Webhook地址,用HTTP POST发送JSON即可:
- 获取钉钉群机器人Webhook(安全设置建议勾选“加签”或“IP白名单”)
- 构造符合钉钉消息格式的JSON(推荐text或markdown类型,支持@相关人员)
- 使用RestTemplate或OkHttp发送POST请求,设置Content-Type为application/json
- 示例内容可包括:服务名、异常时间、HTTP状态码、traceId(如有)、精简错误摘要,并附上快速跳转到APM或日志平台的链接
增强可靠性与可观测性
告警不是发出去就结束,还要考虑失败重试、频率控制和链路闭环:
- 通知失败时记录本地日志并尝试异步重发(可用ScheduledExecutorService延时重试2次)
- 对同一异常类型做简单去重(如5分钟内相同异常类+相同消息只告警1次),避免刷屏
- 在告警内容中带上traceId或requestId,方便快速关联分布式链路追踪(如SkyWalking、Pinpoint)
- 生产环境建议将告警逻辑抽为独立模块,通过配置开关控制是否启用邮件/钉钉,便于灰度和降级
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











