springAOP拦截并打印controller层请求日志---注解方式实现

/**
 * Aop implementation of request log printing
 *
 * Created by wenqiangxia 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("返回值:{}\n\t", 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 by wenqiangxia on 9:10 2017/11/2
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLog {

    String description() default "";
}

注解加在controller层方法上即可

你可能感兴趣的:(spring,aop,java)