SpringBoot實戰:輕松使用AOP+注解實現操作日志記錄
引言
在企業應用開發中,操作日志記錄是確保系統安全性、可追溯性以及調試分析的重要手段之一。通過記錄用戶的操作行為,不僅可以幫助開發者快速定位問題,還能滿足審計和合規需求。本文旨在探討如何在SpringBoot應用程序中通過AOP(面向切面編程)和自定義注解實現操作日志記錄,并將日志存儲到數據庫中。
AOP簡介
AOP(Aspect Oriented Programming)面向切面編程,是對OOP(Object-Oriented Programming)的一種補充。它允許開發者在不修改源代碼的情況下增加額外的功能,如日志記錄、事務管理、權限控制等。在SpringBoot中,AOP通過注解和動態代理實現,極大地簡化了橫切關注點的管理。
環境準備
- JDK版本:JDK 17
- Spring Boot版本:Spring Boot 3.2.2
- MySQL版本:8.0.37
- 構建工具:Maven
確保項目中包含Spring AOP的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
數據庫設計
首先,需要創建一個操作日志記錄表,用于存儲日志信息。以下是一個簡單的操作日志表結構示例:
CREATE TABLE `sys_oper_log` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(50) DEFAULT NULL COMMENT '模塊標題',
`business_type` varchar(20) DEFAULT NULL COMMENT '業務類型',
`method` varchar(100) DEFAULT NULL COMMENT '方法名稱',
`request_method` varchar(10) DEFAULT NULL COMMENT '請求方式',
`operator_type` varchar(10) DEFAULT NULL COMMENT '操作類別',
`oper_name` varchar(50) DEFAULT NULL COMMENT '操作人員',
`oper_url` varchar(255) DEFAULT NULL COMMENT '請求URL',
`oper_ip` varchar(50) DEFAULT NULL COMMENT '主機地址',
`oper_param` text COMMENT '請求參數',
`json_result` text COMMENT '返回參數',
`status` int DEFAULT NULL COMMENT '操作狀態',
`error_msg` varchar(200) DEFAULT NULL COMMENT '錯誤消息',
`oper_time` datetime DEFAULT NULL COMMENT '操作時間',
`execute_time` bigint DEFAULT NULL COMMENT '執行時長',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志記錄';
創建實體類
對應上述數據庫表,創建一個系統日志實體類SysOperLog,使用Lombok簡化代碼:
@Data
@Schema(description = "操作日志記錄")
@TableName(value = "sys_oper_log")
public class SysOperLog implements Serializable {
// 省略字段定義,參考數據庫表結構
}
創建注解
定義一個自定義注解@Log,用于標記需要記錄日志的方法:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
String title() default "";
BusinessType businessType() default BusinessType.OTHER;
boolean isSaveRequestData() default true;
boolean isSaveResponseData() default true;
String[] excludeParamNames() default {};
}
// 業務操作類型枚舉
public enum BusinessType {
OTHER, INSERT, UPDATE, DELETE
// 可根據實際需要擴展
}
創建切面類
使用@Aspect注解定義一個切面類LogAspect,用于攔截帶有@Log注解的方法,并記錄日志:
@Aspect
@Component
public class LogAspect {
@Autowired
private SysOperLogService sysOperLogService; // 假設的日志服務
@Pointcut("@annotation(com.example.demo.annotation.Log)")
public void logPointcut() {}
@Around("logPointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long executeTime = System.currentTimeMillis() - startTime;
// 收集日志信息,這里僅為示例
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Log logAnnotation = signature.getMethod().getAnnotation(Log.class);
// 省略日志信息組裝過程
// 保存日志
sysOperLogService.saveLog(log); // 假設的保存日志方法
return result;
}
}
注意:這里的saveLog方法需要根據實際業務邏輯進行實現,包括日志信息的詳細組裝和數據庫保存操作。
使用注解
在需要記錄日志的方法上添加@Log注解:
@Service
public class SomeService {
@Log(title = "用戶管理", businessType = BusinessType.UPDATE)
public void updateUserInfo(UserInfo userInfo) {
// 業務邏輯
}
}
總結
通過上述步驟,我們利用AOP和自定義注解在SpringBoot應用中實現了操作日志的記錄。這種方式不僅減少了代碼冗余,提高了開發效率,還增強了系統的可維護性和可擴展性。希望本文對你在實際開發中的日志記錄工作有所幫助。