推荐生产环境采用“捕获异常→异步发送邮件”方式:在@controlleradvice或try-catch中解析异常,用simplejavamail异步发送含traceid、堆栈等上下文的结构化邮件,并接入告警平台实现高可靠通知。

Java 应用发生错误时,通过邮件即时通知开发或运维人员,关键在于:捕获异常 → 格式化日志 → 异步触发邮件发送。不建议在日志框架(如 Logback/Log4j2)的 Appender 中直接发邮件(阻塞主线程、易失败、难监控),推荐“日志采集 + 异步告警”解耦方式。
使用 Logback + SMTPAppender(轻量快速验证)
适合测试环境或低频告警场景。Logback 自带 SMTPAppender,可在 ERROR 级别日志达到一定数量或定时触发时发送汇总邮件。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在
logback.xml中配置 SMTPAppender,指定邮件服务器(如 QQ 邮箱需开启 SMTP 并使用授权码)、收件人、触发条件(EventEvaluator判断是否为 ERROR) - 注意设置
asynchronousSending="true"避免阻塞日志线程 - 缺点:无法按异常类型/业务模块精准路由;邮件内容固定;失败无重试和告警降级
捕获异常后主动触发邮件(推荐用于生产)
在全局异常处理器(如 Spring 的 @ControllerAdvice)或关键 try-catch 块中,解析异常信息,调用独立的邮件服务。
- 用 JavaMail 或更简单的
SimpleJavaMail库发送邮件(支持 TLS/SSL、附件、模板) - 将异常堆栈、请求上下文(如 traceId、URL、用户ID)组装成结构化邮件正文
- 务必异步执行(如
@Async+ 线程池),避免影响主业务响应 - 示例片段:
@Async("notifyExecutor")<br>public void sendErrorAlert(Exception e, String context) {<br> String subject = "[ALERT] " + e.getClass().getSimpleName();<br> String body = String.format("发生异常:%s\n上下文:%s\n堆栈:%s", e.getMessage(), context, ExceptionUtils.getStackTrace(e));<br> emailService.send("admin@example.com", subject, body);<br>}
接入告警平台(高可靠生产方案)
脱离代码层,让日志系统承担通知职责,更易维护和扩展。
- 应用输出 ERROR 日志到控制台或文件,由
Filebeat/Logstash收集,转发至Elasticsearch或Loki - 用
Alertmanager(对接 Prometheus)或Grafana Alerting设置规则:匹配level: ERROR且含关键词(如"NullPointerException"或"timeout")的日志,触发邮件通知 - 优势:集中管理告警策略、支持静默、分组、升级、多通道(邮件/钉钉/企微/电话)
关键注意事项
- 防刷:高频错误需限流(如每分钟最多发 3 封同类型告警),避免邮箱被封或打扰
-
脱敏:日志和邮件中禁止出现密码、身份证、手机号等敏感字段(可用
Logback MaskingPatternLayout或自定义过滤器) - 可观测性:记录邮件发送结果(成功/失败/重试次数)到日志或监控指标,便于排查通知链路问题
- 备用通道:邮件不可达时,至少应降级写入本地告警日志或推送至企业 IM
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










