- 添加拦截器
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Aspect
@Configuration
@Slf4j
public class LoggerAdviceConfig {
/**
* 在这里定义切面的点,Pointcut的表达式语法需要匹配到你调用的方法中
*/
@Pointcut(value = "execution(* com.项目路径.controller.*.*(..))")
public void webLog(){}
private static String[] types = { "java.lang.Integer", "java.lang.Double",
"java.lang.Float", "java.lang.Long", "java.lang.Short",
"java.lang.Byte", "java.lang.Boolean", "java.lang.Char",
"java.lang.String", "int", "double", "long", "short", "byte",
"boolean", "char", "float" };
@Before(value="webLog()")
public void doBefore(JoinPoint joinPoint){
try {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String logStr = "";
HttpServletRequest request = attributes.getRequest();
HttpServletResponse response = attributes.getResponse();
// 记录下请求内容
logStr += "URL:" + request.getRequestURI().toString()+" | ";
logStr += "CLASS_METHOD:" + joinPoint.getSignature().getDeclaringType().getSimpleName() + "." + joinPoint.getSignature().getName()+" | ";
logStr += "ARGS:";
// joinPoint获取参数名
String[] params = ((CodeSignature) joinPoint.getStaticPart().getSignature()).getParameterNames();
// joinPoint获取参数值
Object[] args = joinPoint.getArgs();
/*//注意: 获取方法上有日志注解的方法
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method.getAnnotation(LogParam.class)!=null) {
String description = method.getDeclaredAnnotation(LogParam.class).description();//方法描述(eg:用户列表)
}*/
// 打印请求参数
int i = 0;
for (Object arg : args) {
if (arg == request || arg == response) {
i+=1;
continue;
}
String typeName = "";
try {
typeName = arg.getClass().getTypeName();
} catch (Exception e) {
}
if (!Arrays.asList(types).contains(typeName)) {
// 把参数转成json格式
logStr+="&"+params[i]+"="+ JSONObject.toJSONString(arg);
} else {
logStr+="&"+params[i]+"="+arg;
}
i+=1;
}
logStr+=" | ";
log.info(logStr);
} catch (Throwable e) {
log.error("HaLogParamAspect error.", e);
}
}
}
2.添加注解类
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogParam {
public String description();
}
3.在方法上添加注解即可
@LogParam(description = "用户列表")
@PostMapping("list")
public BaseRes list(@RequestBody User user) {
}
4.注意,我将加注解的注释掉了,这样就拦截所有的方法,并且打印参数,如果不想这样,客户已将第一段拦截器中注意部分放开,将它下面的代码包在if (method.getAnnotation(LogParam.class)!=null) {}里面即可