spring boot 中用 spring aop 实现统一日志审计的核心是定义切面拦截 controller 方法,记录操作人、时间、接口、脱敏参数、返回值及耗时;需配置 aop 依赖、精准切点、异常归一化、性能优化与 security 用户信息集成。

在 Spring Boot 中用 Spring AOP 实现统一日志审计,核心是定义切面(Aspect)拦截目标方法执行,在前后或异常时记录操作人、时间、接口、参数、返回值、耗时等关键审计信息。关键在于精准控制切点(Pointcut)、避免重复记录、处理敏感数据脱敏,并确保不影响主业务性能。
一、添加依赖并启用 AOP
Spring Boot 2.6+ 默认已包含 spring-boot-starter-aop,无需额外引入;若项目中未启用,检查是否含以下依赖:
- Maven 依赖(如缺失):
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-aop</artifactid></dependency>
- 确保类路径下有
@EnableAspectJAutoProxy(Spring Boot 启动类默认已生效,一般无需手动加)。
二、定义审计切面与切点表达式
推荐按 Controller 层方法统一拦截,兼顾 REST 接口可读性与审计粒度。避免直接切 Service(易与事务、重试等交织,且参数/返回值语义不明确)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用
@Pointcut("execution(* com.example.demo.controller..*.*(..))")匹配所有 Controller 方法; - 搭配
@Around获取完整上下文:可捕获入参、出参、异常、耗时; - 用
JoinPoint提取方法签名和参数值,用ProceedingJoinPoint执行原逻辑并捕获结果。
三、实现日志审计逻辑(含脱敏与性能注意)
在 @Around 方法中组织审计日志内容,重点处理三件事:参数脱敏、异常归一化、耗时统计。
- 对手机号、身份证、邮箱等字段做正则脱敏(如
138****1234),避免直接打印明文; - 捕获异常后不要抛出原始堆栈(审计日志只需错误码 + 简要消息),防止敏感路径泄露;
- 用
System.nanoTime()计算毫秒级耗时,比new Date()更轻量; - 建议将日志对象封装为标准 DTO(如
AuditLogDTO),便于后续对接 ELK 或写入数据库。
四、补充:结合 Security 获取当前用户信息
审计日志需记录“谁在什么时候做了什么”,需从 Spring Security 上下文中提取登录用户:
- 调用
SecurityContextHolder.getContext().getAuthentication(); - 若使用 JWT,可从
Authentication.getPrincipal()取自定义UserDetails或解析 token 获取 userId / username; - 注意:确保 WebSecurity 配置中已启用 SecurityContext 在异步线程传播(如需在 @Async 方法中审计,需配置
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL))。
不复杂但容易忽略。










