java可通过自定义@auditlog注解结合aop自动记录操作日志,支持入参、出参、操作人、ip等信息的采集与脱敏,且具备开关控制、异步写入和性能保护机制。

Java中可以通过自定义注解 + AOP(面向切面编程)实现操作日志审计的自动记录,包括入参(方法参数)和出参(返回值),无需在每个业务方法里手动写日志代码。
1. 定义日志审计注解
创建一个自定义注解,用于标记需要审计的方法:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuditLog {
String value() default ""; // 日志描述,如"用户登录"
boolean includeParams() default true; // 是否记录入参
boolean includeResult() default true; // 是否记录出参
boolean excludeNulls() default true; // 是否过滤 null 字段(对对象有效)
}
该注解支持按需开关入参/出参记录,并可附加业务语义描述。
2. 编写AOP切面处理逻辑
使用 @Aspect 切入被 @AuditLog 标记的方法,在执行前后获取参数与返回值:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
JoinPoint.getArgs()获取原始入参;建议用ObjectMapper或ToStringBuilder序列化(注意避免敏感字段、循环引用) - 用
@AfterReturning(returning = "result")捕获返回值;若方法抛异常,则通过@AfterThrowing记录错误信息 - 结合
SecurityContextHolder(Spring Security)或 ThreadLocal 可补充操作人、IP、时间等上下文
3. 控制日志内容与脱敏
实际生产中需注意安全与性能:
- 对密码、手机号、身份证等字段做自动脱敏(例如用正则匹配后替换为
***) - 限制日志长度(如 JSON 字符串截断前2000字符),防止OOM或日志爆炸
- 异步写日志(如发到 Logback 的 AsyncAppender 或发 MQ),避免阻塞主流程
- 对大对象(如文件流、集合过长)跳过序列化,只记录类型和 size
4. 使用示例
在 Controller 或 Service 方法上直接使用:
@PostMapping("/user")
@AuditLog(value = "创建用户", includeParams = true, includeResult = true)
public Result<user> createUser(@RequestBody User user) {
return Result.success(userService.save(user));
}</user>
调用时自动输出类似:
[AUDIT] 用户[admin] 调用 创建用户,IP:192.168.1.100,入参:{"name":"张三","phone":"138****1234"},出参:{"id":1001,"name":"张三","status":"ACTIVE"}
不复杂但容易忽略细节,关键是注解设计要灵活、切面要健壮、日志内容要可控。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










