简介:接口请求,打印请求入参、请求头、响应结果日志
1、思路
采用切面实现全局日志打印
2、代码(定义一个切面)
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* @Author:scy
* @Date:2023/3/8 15:44
*/
@Slf4j
@Component
@Aspect
public class RequestLogAspect {
@Pointcut("execution(* com.sou.controller..*(..))")
public void requestServer() {
}
@Before("requestServer()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
try {
log.info("request start》》》|IP:{}|URL:{}|header:{}|param:{}", request.getRemoteAddr(),
request.getRequestURL().toString(),
JSONObject.toJSONString(this.getHeader(request)), JSONObject.toJSONString(this.getRequestParams(joinPoint)));
} catch (Exception e) {
log.info("全局请求日志打印异常:", e);
}
}
@Around("requestServer()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object result = proceedingJoinPoint.proceed();
stopWatch.stop();
try {
log.info("response end》》》|result:{}|elapsedTime:{}", JSONObject.toJSONString(result), stopWatch.getTotalTimeMillis());
} catch (Exception e) {
log.info("全局响应日志打印异常:", e);
}
return result;
}
@After("requestServer()")
public void doAfter(JoinPoint joinPoint) {
}
/**
* 获取入参
*
* @param joinPoint
* @return
*/
private Map<String, Object> getRequestParams(JoinPoint joinPoint) {
Map<String, Object> requestParams = new HashMap<>();
//参数名
String[] paramNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
//参数值
Object[] paramValues = joinPoint.getArgs();
for (int i = 0; i < paramNames.length; i++) {
Object value = paramValues[i];
//如果是文件对象
if (value instanceof MultipartFile) {
MultipartFile file = (MultipartFile) value;
value = file.getOriginalFilename();
}
requestParams.put(paramNames[i], value);
}
return requestParams;
}
private Map<String, Object> getHeader(HttpServletRequest request) {
Map<String, Object> headerParams = new HashMap<>(1);
// 获取所有请求头名称并遍历
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
headerParams.put(headerName, headerValue);
}
return headerParams;
}
}