WebLogAspect.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.poyee.aspect.weblog;
  2. import cn.hutool.json.JSONUtil;
  3. import com.poyee.utils.ServletUtils;
  4. import org.aspectj.lang.JoinPoint;
  5. import org.aspectj.lang.Signature;
  6. import org.aspectj.lang.annotation.*;
  7. import org.aspectj.lang.reflect.MethodSignature;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.core.annotation.Order;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.util.StringUtils;
  13. import org.springframework.web.bind.annotation.RequestBody;
  14. import org.springframework.web.bind.annotation.RequestParam;
  15. import org.slf4j.MDC;
  16. import javax.servlet.http.HttpServletRequest;
  17. import java.lang.reflect.Method;
  18. import java.lang.reflect.Parameter;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Objects;
  23. import java.util.UUID;
  24. import java.util.stream.Collectors;
  25. import java.util.stream.IntStream;
  26. /**
  27. * 统一日志处理切面
  28. */
  29. @Aspect
  30. @Component
  31. @Order(1)
  32. public class WebLogAspect {
  33. private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
  34. @Pointcut("execution(public * com.poyee.controller..*.*(..))")
  35. public void webLog() {
  36. }
  37. @Before("webLog()")
  38. public void doBefore(JoinPoint joinPoint) {
  39. HttpServletRequest request = ServletUtils.getRequest();
  40. String traceId = Objects.requireNonNull(request).getHeader("X-Trace-Id");
  41. if (!StringUtils.hasText(traceId)) {
  42. traceId = UUID.randomUUID().toString().replace("-", "");
  43. }
  44. MDC.put("traceId", traceId);
  45. long currentTimeMillis = System.currentTimeMillis();
  46. String requestURI = request.getRequestURI();
  47. RequestNoContext.callTime.set(currentTimeMillis);
  48. RequestNoContext.apiUrl.set(requestURI);
  49. RequestNoContext.currentThreadId.set(currentTimeMillis);
  50. Signature signature = joinPoint.getSignature();
  51. MethodSignature methodSignature = (MethodSignature) signature;
  52. Method method = methodSignature.getMethod();
  53. String argsJson = JSONUtil.toJsonStr(getParameter(method, joinPoint.getArgs()));
  54. RequestNoContext.requestParam.set(argsJson);
  55. String log = "\n===============[" + RequestNoContext.currentThreadId.get() + "]请求内容开始===============" +
  56. "\n 请求地址:" + requestURI +
  57. "\n 请求方式:" + request.getMethod() +
  58. "\n 客户端 IP:" + request.getRemoteAddr() +
  59. "\n 接口参数:" + argsJson +
  60. "\n===============[" + RequestNoContext.currentThreadId.get() + "]请求内容结束===============";
  61. logger.info(log);
  62. }
  63. @AfterReturning(value = "webLog()", returning = "returns")
  64. public void afterReturning(Object returns) {
  65. long costTime = System.currentTimeMillis() - RequestNoContext.callTime.get();
  66. logger.info("\n--------------[{}]返回内容开始----------------\n 接口地址:{}\n 返回内容:{}\n 请求耗时:{}ms\n--------------[{}]返回内容结束----------------", RequestNoContext.currentThreadId.get(), RequestNoContext.apiUrl.get(), JSONUtil.toJsonStr(returns), costTime, RequestNoContext.currentThreadId.get());
  67. RequestNoContext.remove();
  68. MDC.remove("traceId");
  69. }
  70. @AfterThrowing(value = "webLog()", throwing = "e")
  71. public void throwing(Throwable e) {
  72. HttpServletRequest request = ServletUtils.getRequest();
  73. long costTime = System.currentTimeMillis() - RequestNoContext.callTime.get();
  74. logger.error("\n--------------[{}]返回内容开始----------------\n 接口地址:{}\n 请求令牌:{}\n 接口参数:{}\n 请求失败:{}\n 请求耗时:{}ms\n--------------[{}]返回内容结束----------------", RequestNoContext.currentThreadId.get(), RequestNoContext.apiUrl.get(), Objects.requireNonNull(request).getHeader("Authorization"), RequestNoContext.requestParam.get(), e.getMessage(), costTime, RequestNoContext.currentThreadId.get());
  75. RequestNoContext.remove();
  76. MDC.remove("traceId");
  77. }
  78. /**
  79. * 根据方法和传入的参数获取请求参数
  80. */
  81. private Object getParameter(Method method, Object[] args) {
  82. Parameter[] parameters = method.getParameters();
  83. List<Object> argList = IntStream.range(0, parameters.length)
  84. .mapToObj(i -> {
  85. Parameter parameter = parameters[i];
  86. RequestBody requestBody = parameter.getAnnotation(RequestBody.class);
  87. if (requestBody != null) {
  88. return args[i];
  89. }
  90. RequestParam requestParam = parameter.getAnnotation(RequestParam.class);
  91. if (requestParam != null) {
  92. Map<String, Object> map = new HashMap<>();
  93. String key = StringUtils.hasText(requestParam.value())
  94. ? requestParam.value()
  95. : parameter.getName();
  96. map.put(key, args[i]);
  97. return map;
  98. }
  99. return null;
  100. })
  101. .filter(Objects::nonNull)
  102. .collect(Collectors.toList());
  103. if (argList.isEmpty()) {
  104. return null;
  105. } else if (argList.size() == 1) {
  106. return argList.get(0);
  107. } else {
  108. return argList;
  109. }
  110. }
  111. }