借着项目需要编写切面日志,这里提供简单实现方案
1.创建操作类型枚举类
public enum OperationEnum {
CREATE("create", "创建"),
SIGN("sign", "签到");
private final String value;
private final String label;
}
2.自定义注解LogAnnotate
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotate {
OutageTicketOperationEnum value();
}
3.给需要添加日志切面的方法,添加日志跟踪参数,抽成为Base,其他所有入参继承Base
public class Base {
private String operationId;
private String operationCoreParam;
}
4.编写切面
@Aspect
@Component
public class LogAspect {
@Resource
private LogFeign logFeign;
@Pointcut("@annotation(com.pk.infrastructure.aop.LogAnnotate)")
public void logOperation() {}
/**
* 环绕是最后执行的
*/
@Around("logOperation()&&@annotation(logAnnotate)")
public Object doAround(ProceedingJoinPoint point, LogAnnotate logAnnotate) throws Throwable{
Object result = point.proceed();//执行切点
//获取自定义注解的信息,操作类型
logger.info("LogAOP param value:{}", logAnnotate.value());
//获取入参
final JSONObject obj = (JSONObject) Arrays.stream(point.getArgs())
.findFirst()
.map(JSONObject::toJSON)
.orElseGet(JSONObject::new);
log.info("操作编号:{},操作核心参数:{}",obj.get("operationId"),obj.get("operationCoreParam"))
//doSomeThings
return result;
}
}
5.应用层方法使用注解,同时返回当前操作的主键
@Service
public class ApplicationService {
private final OutageTicketRepository outageTicketRepository
@LogAnnotate(OperationEnum.SIGN)
public String addSignAddress(SignAddress command) {
return repository.addSignAddress(command)
}
}