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


    基于注解和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){
            
        }
    }

    持续更新!!!

  • 相关阅读:
    Android开发 LiveData与MutableLiveData详解
    Kotlin几个很有用的关键字
    Android开发 navigation入门详解
    java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) ........
    巧用Kotlin:内置函数let、also、with、run、apply大大提高你的开发效率!
    数据结构与算法链表
    数据结构与算法数组
    数据结构与算法队列
    算法目录
    回来
  • 原文地址:https://www.cnblogs.com/flyinghome/p/13988066.html
Copyright © 2020-2023  润新知