您的位置:首页 > 编程语言 > Java开发

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

2017-11-02 14:24 543 查看
/**
* 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层方法上即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐