zoukankan      html  css  js  c++  java
  • Spring AOP拦截并打印controller层请求日志

    /**
     * Aop implementation of request log printing
     *
     * Created b on 9:07 2017/10/27
     */
    @Component
    @Aspect
    public class RequestLog {
    
        public static final Logger LOG = LoggerFactory.getLogger(RequestLog.class);
    
        /**
         * Define a pointcut
         */
    //    @Pointcut("execution(* com.wqxia.*.*(..))")
        @Pointcut("@annotation(com.wqxia.common.log.annotation.SystemLog)")
        public void controllerLog() {}
    
        /**
         * Print Log before controller
         * @param joinPoint
         */
        @Before("controllerLog()")
        public void before(JoinPoint joinPoint) throws Exception {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    
            LOG.info("请求IP:{}", request.getRemoteAddr());
            LOG.info("请求路径:{}", request.getRequestURL());
            LOG.info("请求方式:{}", request.getMethod());
            LOG.info("方法描述:{}", getMethodDescription(joinPoint));
            LOG.info("请求参数:{}", JSONObject.toJSONString(request.getParameterMap()));
    
        }
    
        /**
         * Print the time that request method execution spend
         * @param joinPoint
         * @throws Throwable
         */
        @Around("controllerLog()")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
            long startTime = System.currentTimeMillis();
            Object[] args = joinPoint.getArgs();
            Object retVal = joinPoint.proceed(args);
            long endTime = System.currentTimeMillis();
            LOG.info("执行时间:{} ms", endTime - startTime);
            LOG.info("返回值:{}
    	", JsonUtils.obj2Json(retVal));
            return retVal;
        }
    
        /**
         * Print exception
         * @param ex
         */
        @AfterThrowing(throwing = "ex", pointcut = "controllerLog()")
        public void afterThrowing(Throwable ex) {
            LOG.error("发生异常:{}", ex.toString());
        }
    
        /**
         * Acquire the description for annotation target method
         * @param joinPoint
         * @return
         * @throws Exception
         */
        protected String getMethodDescription(JoinPoint joinPoint) throws Exception {
            String targetName = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            Object[] arguments = joinPoint.getArgs();
            Class<?> targetClass = Class.forName(targetName);
            Method[] methods = targetClass.getMethods();
    
            String description = "";
            for (Method method : methods) {
                if(method.getName().equals(methodName)) {
                    Class<?>[] clazzs = method.getParameterTypes();
                    if(clazzs.length == arguments.length) {
                        description = method.getAnnotation(SystemLog.class).description();
                        break;
                    }
                }
            }
            return description;
        }
    }
    注解:
    /**
     * System log annotation for controller or service
     * Created on 9:10 2017/11/2
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SystemLog {
    
        String description() default "";
    }
    注解加在controller层方法上即可
  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/junzi2099/p/14208667.html
Copyright © 2011-2022 走看看