通常我们自定义一个Aspect用于记录请求日志,方便问题排查。
主要记录了如下信息:
- 请求方法及请求地址
- 客户端IP地址
- 调用的控制器类及方法名
- 请求头信息
- 请求参数
- 处理耗时
代码实现
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
@Slf4j
@Aspect
@Component
public class WebLogAspect {
private final String LOCALHOST_IPV4 = "127.0.0.1";
private final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1";
// 切入点
@Pointcut("execution(public * demo.controller..*(..)))")
public void pointCut() {
}
@Around("pointCut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 开始处理时间
long startTime = System.currentTimeMillis();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 构建成一条长日志,避免并发下日志输出错乱
StringBuilder sb = new StringBuilder(300);
// 日志参数
List