Java中结合AOP实现方法审计日志的核心是通过@Aspect切面在目标方法执行前后自动织入日志逻辑,避免硬编码;定义@AuditLog注解精准控制审计范围,记录“谁、何时、在哪、做了什么、结果如何、耗时多少”,并脱敏敏感信息、异步输出、异常隔离与性能优化。

Java 中结合 AOP 实现方法审计日志,核心是利用 Spring AOP 在目标方法执行前后自动织入日志逻辑,避免在业务代码中硬编码日志语句,提升可维护性和关注点分离。
定义审计日志切面(@Aspect)
创建一个带 @Aspect 和 @Component 的类,声明为 Spring 管理的 Bean。使用 @Around 拦截需要审计的方法(如标注了自定义注解 @AuditLog 的方法),获取方法签名、参数、返回值和异常信息。
- 用
ProceedingJoinPoint获取目标方法名、参数值、目标对象等上下文 - 记录开始时间,执行
proceed()后捕获返回值或异常 - 计算耗时,组装结构化日志内容(如 JSON 格式)
设计轻量级审计注解(@AuditLog)
自定义注解用于精准控制哪些方法需审计,支持可选属性(如是否记录参数、是否记录返回值、业务操作类型等)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 注解保留策略设为
@Retention(RetentionPolicy.RUNTIME) - 在切面中通过
joinPoint.getSignature().getDeclaringType().getMethod(...)或更简单地用joinPoint.getTarget().getClass().getDeclaredMethod(...)反射获取该注解实例 - 示例:
@AuditLog(operation = "用户登录", includeParams = true)
日志内容与输出规范
审计日志不是调试日志,应聚焦「谁(用户/系统身份)、何时(时间戳)、在哪(类+方法)、做了什么(操作类型)、结果如何(成功/失败+原因)、耗时多少」。
立即学习“Java免费学习笔记(深入)”;
- 推荐使用 SLF4J + Logback,通过
MDC注入请求唯一 ID、当前用户 ID、租户 ID 等上下文字段,确保日志可追溯 - 避免直接打印敏感参数(如密码、身份证号),可在切面中做脱敏处理(如
String.valueOf(param).replaceAll("\d{4}(?=\d{4})", "****")) - 异步写入(如 Logback 的
AsyncAppender)防止阻塞主流程
处理异常与性能边界
审计切面本身不能因日志失败影响业务逻辑,同时要防止过度日志拖慢系统。
- 在
try-catch中记录日志,异常只打内部错误日志,不抛出 - 对高频调用方法(如 getter、工具方法)谨慎启用审计,可通过注解属性或切点表达式排除
- 避免在切面中做复杂对象序列化(如
JSON.toJSONString(param)),可改用toString()或白名单字段提取

















