RequestLogAspect.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package com.persagy.aspects;
  2. import cn.hutool.core.util.ArrayUtil;
  3. import cn.hutool.core.util.IdUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.extra.servlet.ServletUtil;
  6. import com.persagy.dmp.common.model.response.CommonResult;
  7. import com.persagy.dmp.common.utils.JsonHelper;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.aspectj.lang.JoinPoint;
  10. import org.aspectj.lang.annotation.*;
  11. import org.springframework.context.annotation.EnableAspectJAutoProxy;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.web.context.request.RequestContextHolder;
  14. import org.springframework.web.context.request.ServletRequestAttributes;
  15. import org.springframework.web.multipart.MultipartFile;
  16. import javax.servlet.ServletRequest;
  17. import javax.servlet.ServletResponse;
  18. import javax.servlet.http.HttpServletRequest;
  19. import java.util.LinkedList;
  20. import java.util.List;
  21. /**
  22. * @author: yaoll
  23. * @date: 2020-09-22
  24. * @verison: 1.0
  25. */
  26. @Slf4j
  27. @Aspect
  28. @Component
  29. @EnableAspectJAutoProxy
  30. public class RequestLogAspect {
  31. private static final ThreadLocal<LogData> DATA_STORAGE = new ThreadLocal<>();
  32. /** @Pointcut("execution(* *(..))") */
  33. @Pointcut("execution(public * com.persagy.dmp..*.controller.*.*(..))")
  34. public void controllerPoint() {
  35. }
  36. @Before("controllerPoint()")
  37. public void doBefore(JoinPoint joinPoint) {
  38. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  39. if (null == attributes) {
  40. log.warn("获取请求参数失败!!");
  41. return;
  42. }
  43. HttpServletRequest request = attributes.getRequest();
  44. if (!"application/json".equals(request.getContentType())){
  45. return;
  46. }
  47. LogData data = initFlag(request);
  48. DATA_STORAGE.set(data);
  49. log.info("{} REQUEST URL : {} {} {} {}", data.intFlag, data.method, data.url, data.remoteIp, data.remotePort);
  50. log.info("{} REQUEST ARGS : {} ", data.intFlag, JsonHelper.toJsonStrQuietly(prepare(joinPoint)));
  51. }
  52. /**
  53. * 准备数据
  54. * @param joinPoint
  55. * @return
  56. */
  57. public static List<Object> prepare(JoinPoint joinPoint) {
  58. Object[] args = joinPoint.getArgs();
  59. List<Object> list = new LinkedList<>();
  60. if(ArrayUtil.isEmpty(args)) {
  61. return list;
  62. }
  63. for (Object arg : args) {
  64. if (arg instanceof ServletRequest ||
  65. arg instanceof ServletResponse ||
  66. arg instanceof MultipartFile) {
  67. continue;
  68. }
  69. list.add(arg);
  70. }
  71. return list;
  72. }
  73. @AfterReturning(returning = "ret", pointcut = "controllerPoint()")
  74. public void doAfterReturning(Object ret) {
  75. if (null== DATA_STORAGE.get()){
  76. return;
  77. }
  78. LogData data = DATA_STORAGE.get();
  79. String result = null;
  80. if (ret != null) {
  81. if (ret instanceof CommonResult) {
  82. result = ((CommonResult) ret).getResult();
  83. } else {
  84. result = ret.getClass().getName();
  85. }
  86. }
  87. log.info("{} REQUEST DURATION : {} {} {}", data.intFlag, System.currentTimeMillis() - data.timestamp, result, data.url);
  88. DATA_STORAGE.remove();
  89. }
  90. @AfterThrowing(throwing = "ex", pointcut = "controllerPoint()")
  91. public void doAfterThrowing(Throwable ex) {
  92. if (null== DATA_STORAGE.get()){
  93. return;
  94. }
  95. LogData data = DATA_STORAGE.get();
  96. log.error("{} REQUEST EXCEPTION: {} {} {}", data.intFlag, System.currentTimeMillis() - data.timestamp, data.url, ex);
  97. DATA_STORAGE.remove();
  98. }
  99. /**
  100. * 初始化日志记录
  101. * @param request
  102. * @return
  103. */
  104. private static LogData initFlag(HttpServletRequest request) {
  105. LogData data = new LogData();
  106. // 请求IP
  107. data.remoteIp = ServletUtil.getClientIP(request, null);
  108. // 请求端口
  109. data.remotePort = request.getRemotePort();
  110. data.timestamp = System.currentTimeMillis();
  111. data.method = request.getMethod();
  112. String uri = request.getRequestURI();
  113. String queryString = request.getQueryString();
  114. data.url = StrUtil.isBlank(queryString) ? uri : StrUtil.concat(true, uri, "?", queryString);
  115. data.intFlag = IdUtil.fastSimpleUUID();
  116. DATA_STORAGE.set(data);
  117. return data;
  118. }
  119. /***
  120. * Description: 日志数据实体
  121. * @author : lijie
  122. * @date :2021/8/18 10:36
  123. * Update By lijie 2021/8/18 10:36
  124. */
  125. private static class LogData {
  126. private String intFlag;
  127. private Long timestamp;
  128. private String url;
  129. private String method;
  130. private String remoteIp;
  131. private Integer remotePort;
  132. }
  133. }