码迷,mamicode.com
首页 > 编程语言 > 详细

【java】基于注解的日志处理

时间:2020-11-21 11:49:52      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:dna   col   doc   系统   java   先后   script   exp   ret   

基于注解和AOP实现的自定义日志系统。只需要两个类就能实现:

1. 注解类:设置自定义属性属性

2. 切面类:用于横切注解,获取注解属性值,保存日志

方法一

注解类:

//注解类 
//属性可以根据需要自行添加

@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】基于注解的日志处理

标签:dna   col   doc   系统   java   先后   script   exp   ret   

原文地址:https://www.cnblogs.com/flyinghome/p/13988066.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!