spring aop实现统一日志与性能监控的核心是不改业务代码自动织入逻辑,需定义切点、通知及安全获取上下文;关键日志字段涵盖请求、执行、状态、用户四维度;依赖spring-boot-starter-aop,切面类加@component和@aspect,主用@around统计耗时并记录,异常用@afterthrowing单独捕获,支持自定义注解与异步场景适配。

Spring 用 AOP 实现统一日志记录和性能监控,核心是“不改业务代码,自动织入日志逻辑”。关键在于定义好切点(哪些方法要监控)、通知(什么时候记、记什么)、以及如何安全获取请求上下文和执行结果。
明确要记录的关键信息
日志不是越多越好,而是要抓住业务可观测性必需的字段。实际项目中建议至少包含:
- 请求维度:URL、HTTP 方法(GET/POST)、客户端 IP(需注意代理穿透)、User-Agent
- 执行维度:类名 + 方法名、入参(JSON 序列化后脱敏敏感字段)、耗时(毫秒级)、返回结果(可选,大对象建议截断或开关控制)
- 状态维度:是否成功(HTTP 状态码或业务 code)、异常堆栈(仅 @AfterThrowing 捕获)
- 用户维度:当前登录用户 ID 或用户名(通过 SecurityContext 或 ThreadLocal 获取)
配置基础依赖与启用 AOP
Spring Boot 项目只需引入 starter,无需额外配置即可启用 AOP:
- 在 pom.xml 中添加:
<dependency><br> <groupid>org.springframework.boot</groupid><br> <artifactid>spring-boot-starter-aop</artifactid><br></dependency> - 确保切面类被 Spring 扫描到:加上
@Component和@Aspect注解 - 不需要
@EnableAspectJAutoProxy—— Spring Boot 自动完成
编写环绕通知(@Around)作为主切面
用 @Around 可以在方法执行前后都操作,是最适合日志+耗时统计的方式:
- 用
ProceedingJoinPoint获取目标方法签名、参数、并调用proceed()执行原逻辑 - 用
RequestContextHolder提取 HTTP 请求信息(注意非 Web 环境会空指针,需判空) - 耗时计算必须用
System.currentTimeMillis(),避免纳秒精度带来的误差或时钟回拨问题 - 参数和返回值建议用 FastJSON2 或 Jackson 的
writeValueAsString()转 JSON,避免 toString() 出现循环引用或空指针
区分场景,组合多种通知类型
单一 @Around 能覆盖大部分需求,但复杂场景建议分层处理:
- 正常流程日志:用 @Around 记 URL、参数、耗时、结果
- 异常追踪:单独写 @AfterThrowing,捕获异常并记录完整堆栈(不要混在 @Around 里 try-catch)
- 审计类日志(如操作日志):配合自定义注解(如 @LogOperation("删除订单")),在切面里读取注解 value 作为操作描述,更语义化
-
异步任务监控:若方法跑在 @Async 中,需确认切面是否生效(默认不代理异步方法,需开启
exposeProxy=true并手动获取代理)











