日志aop
https://www.jianshu.com/p/577e4bd47195
建一个日志切面类
用 @Aspect 开启切面,
@Aspect
public class OperateLogAspect {
@Pointcut("execution(* *..CompInfoFragment.collectLog(..))")
public void logForFunction(){};
@Before("logForFunction() && args(function,isSucc,ppid,finishOpenTime,startOpenTime)")
public void log(JoinPoint joinPoint,String function, boolean isSucc,long ppid,long finishOpenTime,long startOpenTime){
collectLog(function,isSucc,ppid,finishOpenTime,startOpenTime);
}
@Pointcut 是定义切点:通过类名+方法名模糊匹配到之前定义的空方法
logForFunction是切点名称 自己定义
@Before("logForFunction() 是切点时机:这里在这个切点(也就是空方法执行)前,插入我们的操作日志记录,
注意这里的方法参数名称必须和空方法一致,并且不能是对象!不能是enum,只能是基本数据类型。
collectLog(function,isSucc,ppid,finishOpenTime,startOpenTime); 自己定义的日志逻辑
与切面aop结合
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface OptLog {
写注释标识类,
@Around("@annotation(com.kpmg.datalake.operatelog.annotation.OptLog)")
在切点处指向注解
在方法出标志处注解
@PostMapping("/saveProject")
@OptLog(logType = LogTypeEnum.OPERATION, module = "system", description = "操作项目")
public ServerResponse<String> saveProject(@RequestBody ProjectEntityVO projectEntityVO ) {
return projectManagementService.saveProjectEnt(projectEntityVO.getProject(),projectEntityVO.getEntity());
}
aop原理