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("返回值:{}\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 on 9:10 2017/11/2 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface SystemLog { String description() default ""; }
注解加在controller层方法上即可
微信扫一扫,关注我的微信公众号【Louis军】,获取更多及时更新。
如想交个朋友,可加微信:hunter2881(备注:博客园)