package com.paic.phucp.console.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 入参,出参,响应等日志打印
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ParamsLog {
String description() default "";
}
package com.paic.phucp.console.aop;
import com.alibaba.fastjson.JSON;
import com.paic.phucp.console.annotations.ParamsLog;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Aspect
@Component
public class ParamsLogAop {
@Pointcut("@annotation(com.paic.phucp.console.annotations.ParamsLog)")
public void paramsLog() {
// this is aop pointcut need not to doSomething
}
@Before("paramsLog()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
ParamsLog paramsLog = signature.getMethod().getAnnotation(ParamsLog.class);
if (null == paramsLog) {
return;
}
Object[] args = joinPoint.getArgs();
List<Object> params = Arrays.stream(args).filter(p -> !(p instanceof ServletRequest || p instanceof ServletResponse)).collect(Collectors.toList());
log.info("URL:{}; {};Request Params:{}", request.getRequestURL().toString(), paramsLog.description(), JSON.toJSONString(params));
}
@Around("paramsLog()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
long end = System.currentTimeMillis();
log.info("Response cost time : {} ms, Response Args : {}", (end - start), JSON.toJSONString(result));
return result;
}
}