spring boot全局异常告警通过@restcontrolleradvice捕获异常,异步调用钉钉/企业微信机器人推送消息,需配置webhook、截断超长内容、过滤环境与异常类型,并注意加签、@提醒及频率控制。

Spring Boot 在全局异常处理中集成钉钉或企业微信机器人发送线上报警,核心是“捕获异常 + 构建消息 + 异步推送”。不需要改业务代码,也不依赖日志框架扫描,只需一个 @RestControllerAdvice 切入点,配合轻量 HTTP 客户端即可落地。
一、准备机器人 Webhook 地址和密钥
这是所有通知的基础,必须提前配置好:
-
钉钉:进入群设置 → 智能助手 → 添加自定义机器人 → 开启「加签」(推荐),复制
webhook URL和secret -
企业微信:在群管理页添加「群机器人」→ 复制
webhook key(即 URL 中的key=xxx部分) - 建议将这两个地址和密钥统一放在
application.yml中,便于多环境切换
二、定义告警服务类(支持双渠道)
用一个服务类封装发送逻辑,避免重复代码。关键点:异步执行、消息截断、基础字段标准化。
- 使用
@Async注解确保不阻塞主请求线程(需开启@EnableAsync) - 钉钉消息体最大 2000 字符,企业微信为 2048 字符,超出需
substring(0, 1990)截断 - 消息内容至少包含:异常类型、堆栈摘要、发生时间、服务名、请求路径(如有)
- 企业微信支持
@手机号,可配置notice.phone-list实现自动提醒值班人
三、编写全局异常处理器
继承 @RestControllerAdvice,只对非业务异常触发告警(如 NullPointerException、RuntimeException),跳过已定义的 BusinessException 等可控异常。
- 在
@ExceptionHandler(Exception.class)方法里,先记录完整日志:log.error("Uncaught exception", e) - 构造告警消息对象(推荐用
Map<string object></string>或专用 DTO),再交由上一步的告警服务异步发送 - 可加简单过滤:比如开发环境
spring.profiles.active=dev时直接 return,不发通知
四、配置与注意事项
真正上线前,这几个细节容易被忽略但影响可用性:
- HTTP 客户端建议用
Forest或OkHttp,比RestTemplate更易控制超时、重试和连接池 - 钉钉加签需按规则拼接
timestamp\nsecret并做 HmacSHA256,生成sign参数追加到 URL 后 - 企业微信若要 @ 成员,消息体中需包含
"mentioned_mobile_list": ["13800138000"]字段 - 建议加一层告警频率控制(如 5 分钟内同异常类型最多发 1 条),防刷屏











