zoukankan      html  css  js  c++  java
  • 【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){
            
        }
    }

    持续更新!!!

  • 相关阅读:
    日志规范实践
    序列化和反序列化及Protobuf 基本使用
    简述TCP网络编程本质
    笔记:多线程服务器的适用场合(1)
    聊聊同步、异步、阻塞与非阻塞(转)
    《EntrePreneur》发刊词
    make和makefile简明基础
    luogu P3687 [ZJOI2017]仙人掌 |树形dp
    luogu P3172 [CQOI2015]选数 |容斥原理
    luogu P4513 小白逛公园 |线段树
  • 原文地址:https://www.cnblogs.com/flyinghome/p/13988066.html
Copyright © 2011-2022 走看看