【java】基于注解的日志处理
2021-03-17 03:24
标签:dna col doc 系统 java 先后 script exp ret 基于注解和AOP实现的自定义日志系统。只需要两个类就能实现: 1. 注解类:设置自定义属性属性 2. 切面类:用于横切注解,获取注解属性值,保存日志 方法一 注解类: 切面类: 测试类: 方法二 其余一致,切面类做了修改: 持续更新!!! 【java】基于注解的日志处理 标签:dna col doc 系统 java 先后 script exp ret 原文地址:https://www.cnblogs.com/flyinghome/p/13988066.html//注解类
//属性可以根据需要自行添加
@Target({ElementType.TYPE, ElementType.METHOD})//目标是方法
@Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取
//@Inherited
@Documented
public @interface SysLog {
/**
* 描述
*/
String description() default "";
/**
* 行为类型
* 1.违规行为;2.异常行为;3 一般行为
*/
String behaviourType() default "3";
/**
* 日志风险级别
* 1紧急、2重要、3一般、4信息
*/
String level() default "4";
}
@Aspect//声明这是一个事务切面
@Slf4j
@Component//让其被spring管理
public class SysLogAspect {
@Around("@annotation(sysLog)")
@SneakyThrows
public void around(ProceedingJoinPoint point, SysLog sysLog) {
//-----------环绕通知开始-----------
//保存日志的逻辑
Object obj = point.proceed();
//-----------环绕通知结束-----------
//根据obj结果更新日志逻辑
}
}
//测试类
@SysLog(description = "这是一个测试",behaviourType = "1",level = "2")
@PostMapping("/test")
public String getTest(){
//业务逻辑
//...
return "test";
}
@Aspect//声明这是一个事务切面
@Slf4j
@Component//让其被spring管理
public class SysLogAspect {
//声明切点
@Pointcut("@annotation(com.xx.xx.SysLog)")
public void logPointCut(){}
//执行的先后顺序是 环绕通知开始-->前置通知before-->后置通知after-->环绕通知结束
@Around("logPointCut()")
@SneakyThrows
public void around(ProceedingJoinPoint point, SysLog sysLog) {
//-----------环绕通知开始-----------
//ProceedingJoinPoint只能用于环绕通知,此参数写在前置和后置通知中会报错
//获取request、response
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestCOntextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
//保存日志的逻辑
//相当于自己写在controller中的代码
Object obj = point.proceed();
//-----------环绕通知结束-----------
//根据obj结果更新日志逻辑
}
//此外还可以加上前置通知 后置通知等
@Before("logPointCut()")
public void doBefore(JoinPoint point){
//可通过point获取方法名和类名
String className = point.getTarget().getClass().getName();
String methodName = point.getSignature().getName();
}
@After("logPointCut()")
public void doAfter(JoinPoint point){
}
}
上一篇:java中的异常(3)