全局异常处理应异步化日志入库:中小场景用@async+自定义线程池,高可用场景用kafka/rabbitmq解耦;需提前提取请求信息、截断堆栈、脱敏敏感字段,并扩展es聚类、prometheus监控与自动工单。

在 Spring Boot 项目中,全局异常处理本身是同步的(如 @ControllerAdvice + @ExceptionHandler),但错误日志的入库与归档分析不应阻塞主请求线程。核心思路是:捕获异常后,立即异步提交日志任务,由独立线程或消息队列承接后续持久化与分析逻辑。
使用 @Async 实现轻量级异步日志入库
适合中小流量、对日志强一致性要求不高的场景。需确保异步方法在 Spring 容器管理的 Bean 中,且开启异步支持:
- 在启动类添加
@EnableAsync - 定义线程池(避免使用默认
SimpleAsyncTaskExecutor,防止线程无限制创建):
@Bean<br> public TaskExecutor logAsyncExecutor() {<br> ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();<br> executor.setCorePoolSize(4);<br> executor.setMaxPoolSize(10);<br> executor.setQueueCapacity(100);<br> executor.setThreadNamePrefix("log-async-");<br> executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());<br> executor.initialize();<br> return executor;<br> }
在异常处理器中调用异步方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Service<br>public class ErrorLogService {<br> @Async("logAsyncExecutor")<br> public void saveErrorLog(Exception ex, HttpServletRequest request) {<br> // 构建日志实体:时间、堆栈、URL、参数、用户ID(若可得)等<br> ErrorLogEntity log = buildFrom(ex, request);<br> errorLogMapper.insert(log); // 同步写 DB<br> }<br>}
解耦:通过消息队列实现可靠归档与分析
当需要高可用、削峰填谷、多系统消费(如实时告警 + 离线分析 + 可视化看板),应将日志事件发布到消息中间件:
- 推荐 Kafka(吞吐高、分区有序、支持多消费者组)或 RabbitMQ(简单可靠,适合中小规模)
- 全局异常处理器中只做「发送」,不关心是否落库成功;失败可走重试+死信队列机制
- 单独起一个或多个消费者服务,负责:解析日志 → 写入 Elasticsearch(供检索)→ 落仓 MySQL/PostgreSQL(结构化归档)→ 推送至 Flink/Spark 做聚合分析(如高频错误 TOP10、地域分布、时段趋势)
关键点:日志消息体建议为 JSON,含 traceId(集成 Sleuth/Zipkin)、timestamp、exceptionType、message、stackTrace(截断前 2KB 防爆)、requestInfo 等字段,便于下游解析。
避免常见陷阱
-
不要在异步方法里直接依赖 RequestContextHolder:HTTP 请求上下文(如
HttpServletRequest)无法跨线程传递。应在主流程中提前提取必要信息(URI、method、headers、userId)并作为参数传入异步方法 - 异步日志不能替代同步诊断日志:全局异常处理前,应在 Controller 层或 Service 层用 SLF4J 打印带 MDC 的 debug/info 日志,方便链路追踪
- 堆栈过长需截断:完整 stackTrace 可能超 10MB,入库前务必按行数或字节数截断,并保留最外层异常和 root cause
- 敏感信息脱敏:自动过滤 request body 中的 password、token、身份证号等字段,避免日志泄露
归档分析的实用扩展方向
- 基于 Elasticsearch + Kibana 做错误聚类:用 fingerprint(如异常类名 + 关键 message 摘要)合并相似错误,减少噪音
- 接入 Prometheus + Grafana:统计每分钟错误率、P95 响应延迟、各模块错误占比,设置阈值告警
- 定时任务扫描 error_log 表,对连续出现的相同错误触发自动工单(对接 Jira 或飞书机器人)
- 结合 APM 工具(如 SkyWalking)反查错误发生时的完整调用链,定位根因
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










