@Aspect
@Component
public class AccessLogAspect {
private Logger logger = LoggerFactory.getLogger(AccessLogAspect.class);
@Pointcut("execution(* com.xdaozwg.preformance.controller.*.*.*(..))")
public void controllerAspect() {
}
@Around("controllerAspect()")
public Object recordLog(ProceedingJoinPoint jp) throws Throwable {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
// 先执行目标方法
Date start = new Date();
// logger.info("【】【】【】【】【】【】【请求 URI】:{}\n【参数】:{}",request.getRequestURI(),buildQueryString(request));
Object proceed = jp.proceed();
String userAgent = request.getHeader("User-Agent");
/* 【代理】:{};*/
logger.info("\n【请求 URI】:{};\n【参数】:{};\n【方法】:{};\n【ip】:{};\n【结果】:{};\n【耗时】:{}",
request.getRequestURI(),
buildQueryString(request),
request.getMethod(),
/* userAgent == null ? "" : userAgent,*/
getIp(request),
JSON.toJSONString(proceed),
System.currentTimeMillis() - start.getTime()
);
return proceed;
}
public String getIp(HttpServletRequest request) {
// 基于 X-Forwarded-For 获得
String ip = request.getHeader("X-Forwarded-For");
if (!StringUtils.isEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个ip值,第一个 ip 才是真实 ip
int index = ip.indexOf(",");
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
}
/* ip = request.getHeader("Proxy-Client-IP");
if (!StringUtils.isEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
int index = ip.indexOf(",");
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
}
ip = request.getHeader("WL-Proxy-Client-IP");
if (!StringUtils.isEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
int index = ip.indexOf(",");
if (index != -1) {
return ip.substring(0, index);
} else {
return ip;
}
}*/
// 基于 X-Real-IP 获得
ip = request.getHeader("X-Real-IP");
if (!StringUtils.isEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
return ip;
}
// 默认方式
return request.getRemoteAddr();
}
public String buildQueryString(HttpServletRequest request) {
Enumeration<String> es = request.getParameterNames();
if (!es.hasMoreElements()) {
return "";
}
String parameterName, parameterValue;
StringBuilder params = new StringBuilder();
while (es.hasMoreElements()) {
parameterName = es.nextElement();
parameterValue = request.getParameter(parameterName);
params.append(parameterName).append("=").append(parameterValue).append("&");
}
return params.deleteCharAt(params.length() - 1).toString();
}
}
效果: