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层方法上即可
  • 相关阅读:
    springboot内置分页技术
    打印正三角,倒三角,实心棱形,空心棱形
    显示Pl/Sql Developer window list窗口
    Oracle 中使用正则表达式
    前端使用pdf.js预览pdf文件,超级简单
    tomcat8踩坑:url包含|等特殊字符报错400的问题
    使用 Itext 生成PDF字节数组(文件流不落地)
    使用 Itext 生成PDF
    回车提交事件
    python爬虫之re正则表达式库
  • 原文地址:https://www.cnblogs.com/junzi2099/p/14208667.html
Copyright © 2011-2022 走看看