zoukankan      html  css  js  c++  java
  • 使用 spring aop 打印controller日志信息(包括 controller#handler 方法的请求参数名和参数值)

    目标:打印某个controller#handler方法的带有 @RequestParam注解的参数名(注解的value值)和参数值

    package com.sanlian.bigdata.aop;
    
    import com.guanxin.base.annotation.RequestParam;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import java.lang.annotation.Annotation;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    /**
     * 自定义切面类: 打印 controller 参数和执行情况
     *
     * @Auther: oy
     * @Date: 2020/8/4 10:55
     */
    @Component
    @Aspect
    public class LoggerAspect {
    
        Logger logger = LoggerFactory.getLogger(LoggerAspect.class);
    
        // 定义公共切入点
        @Pointcut("execution(public * com.sanlian.bigdata.ctrl.*.*(..))")
        public void webLog() {
        }
    
        @Around("webLog()")
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            long startTime = System.currentTimeMillis();
            Object result = pjp.proceed();
            long time = System.currentTimeMillis() - startTime;
    
            // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
    
            // 获取handler的参数(不包括 request 和 response)
    //        List<Object> logArgs = Arrays.stream(pjp.getArgs())
    //                .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
    //                .collect(Collectors.toList());
    
            // 记录下请求内容
            logger.info("URL : " + request.getRequestURL().toString() + "==============");
            logger.info("HTTP_METHOD : " + request.getMethod());
            logger.info("IP : " + request.getRemoteAddr());
            logger.info("CLASS_METHOD : " + pjp.getSignature().getDeclaringTypeName() + "."
                    + pjp.getSignature().getName());
    
            // 获取所有参数上的注解
            MethodSignature signature = (MethodSignature) pjp.getSignature();
            Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
            Map<String, Object> params = new LinkedHashMap<>();
            int index = 0;
            for (Annotation[] annotations : parameterAnnotations) {
                for (Annotation anno : annotations) {
                    //System.out.println(anno.getClass()); // class com.sun.proxy.$Proxy149
                    if (anno instanceof RequestParam) {
                        params.put(((RequestParam) anno).value(), pjp.getArgs()[index++]);
                    }
                }
            }
            logger.info("params : " + params);
            //logger.info("ARGS : " + logArgs);
            logger.info("handler执行时长 : " + time + " ms =========================================");
    
            return result;
        }
    }

     

      打印结果:

    ---

  • 相关阅读:
    寒假学习第一天
    课堂测试
    第十六周总结
    第十五周总结
    计算最长单词链
    第十四周总结
    人月神话阅读笔记03
    人月神话阅读笔记02
    第十五周学习进度
    冲刺第二十天
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/13433986.html
Copyright © 2011-2022 走看看