一、背景与问题
对于中后台系统,经常要记录用户做了哪些重点行为日志,比如:卓大:2023-06-01 20:07:53 ,IP: 232.34.26.13 设备:Chrome 调用:'修改系统配置' 接口,调用参数为 '123456';
二、架构与思想
其实这种操作记录,网上有很多教程,最好的实现方式就是使用Spring AOP的切面来去解决,我们也是用的AOP切面解决。
区别点:
- 我们直接使用了 swagger的
@Api
和@ApiOperation
注解作为了 操作内容,不用在用户手动填写 - 我们将使用线程池异步回写操作内容
具体代码为:OperateLogAspect.java
和 @OperateLog
注解;
三、具体使用
3.1、配置
第一步需要配置 异步回写线程池,配置为:OperateLogConfig
java
public class OperateLogConfig{
private Function<OperateLogEntity, Boolean> saveFunction; //操作日志存储方法
private Integer corePoolSize;//核心线程数
private Integer queueCapacity;//队列大小
}
具体需要在项目中的config
目录进行配置,比如我们的sa-admin
项目中的config
目录:
OperateLogAspectConfig.java
:
java
@Configuration
public class OperateLogAspectConfig extends OperateLogAspect{
/**
* 配置信息
* @return
*/
@Override
public OperateLogConfig getOperateLogConfig() {
OperateLogConfig config = OperateLogConfig.builder().corePoolSize(4).queueCapacity(1000).build();
return config;
}
}
3.2、@OperateLog 注解
在需要记录日志的地方,加入注解@OperateLog
,只能加到controller的 Class
和Method
上。
加到 Class 上,就相当于给Controller的每个方法都加上了注解@OperateLog
java
@OperateLog
@RestController
@Api(tags = AdminSwaggerTagConst.Business.MANAGER_CATEGORY)
public class CategoryController extends AdminBaseController {
@Autowired
private CategoryService categoryService;
@ApiOperation("添加类目 @author 胡克")
@PostMapping("/category/add")
public ResponseDTO<String> add(@RequestBody @Valid CategoryAddForm addForm) {
return categoryService.add(addForm);
}
@ApiOperation("更新类目 @author 胡克")
@PostMapping("/category/update")
public ResponseDTO<String> update(@RequestBody @Valid CategoryUpdateForm updateForm) {
return categoryService.update(updateForm);
}
}
四、实现原理
4.1、OperateLogAspect切面
核心就是使用了AOP 切面,具体实现类为 OperateLogAspect.java
;
具体请看代码,代码很简单
outline: 'deep'
联系我们
1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。