LogAspect.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package com.gihon.component.web.aspect;
  2. import java.time.Duration;
  3. import java.time.LocalDateTime;
  4. import java.util.Collection;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpServletRequest;
  11. import org.aspectj.lang.ProceedingJoinPoint;
  12. import org.aspectj.lang.annotation.Around;
  13. import org.aspectj.lang.annotation.Aspect;
  14. import org.aspectj.lang.annotation.Pointcut;
  15. import org.aspectj.lang.reflect.MethodSignature;
  16. import org.springframework.stereotype.Component;
  17. import org.springframework.web.context.request.RequestContextHolder;
  18. import org.springframework.web.context.request.ServletRequestAttributes;
  19. import org.springframework.web.multipart.MultipartFile;
  20. import com.gihon.component.util.JacksonJsonUtils;
  21. import com.gihon.component.util.UUIDGenerater;
  22. import com.gihon.component.web.auth.AuthUtils;
  23. import lombok.extern.slf4j.Slf4j;
  24. /**
  25. * 通过切面 记录请求日志
  26. *
  27. * @author baihe
  28. */
  29. @Slf4j
  30. @Aspect
  31. @Component
  32. public class LogAspect {
  33. // private static String types = "java.lang.Integer,java.lang.Double,java.lang.Float,java.lang.Long,java.lang.Short,java.lang.Byte,java.lang.Boolean,java.lang.Char,java.lang.String,int,double,long,short,byte,boolean,char,float";
  34. @Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
  35. public void logPointAround() {
  36. }
  37. @Around("logPointAround()")
  38. public Object doAroundLog(ProceedingJoinPoint thisJoinPoint) throws Throwable {
  39. Object r = null;
  40. String method = thisJoinPoint.getSignature().getName();
  41. LocalDateTime startTime = LocalDateTime.now();
  42. String uuid = UUIDGenerater.genUUID();
  43. String url = null;
  44. Long userId = null;
  45. Map<String, Object> param = null;
  46. boolean flag = false;
  47. try {
  48. ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  49. HttpServletRequest request = requestAttributes.getRequest();
  50. userId = AuthUtils.getUserId();
  51. url = request.getRequestURL().toString();
  52. param = getArgs(thisJoinPoint, ((MethodSignature) thisJoinPoint.getSignature()).getParameterNames());
  53. r = thisJoinPoint.proceed();// 被代理对象执行结果
  54. } catch (Throwable e) {
  55. flag = true;
  56. throw e;// 异常信息有统一异常处理器处理
  57. }finally {
  58. log.info("[访问地址:{}] [方法:{}] [uuid:{}] [执行时间:{}(豪秒)] [userId:{}] [参数:{}] [结果:{}]",
  59. url, (thisJoinPoint.getTarget().getClass().getSimpleName()+"."+method), uuid,
  60. Duration.between(startTime, LocalDateTime.now()).toMillis(),userId, param , flag ? "异常" : "正常");
  61. }
  62. return r;
  63. }
  64. private Map<String, Object> getArgs(ProceedingJoinPoint joinPoint, String[] parameterNames) {
  65. Map<String, Object> allArgs = new HashMap<>();
  66. Object[] args = joinPoint.getArgs();
  67. for (int k = 0; k < args.length; k++) {
  68. Object arg = args[k];
  69. if (arg == null) {
  70. continue;
  71. }
  72. if (arg instanceof ServletResponse || arg instanceof ServletRequest) {//
  73. continue;
  74. } else if (arg instanceof MultipartFile) {// 文件
  75. allArgs.put(parameterNames[k], ((MultipartFile) arg).getOriginalFilename());
  76. } else if (arg instanceof MultipartFile[]) {// 文件
  77. allArgs.put(parameterNames[k], ((MultipartFile[]) arg).length);
  78. } else if (arg instanceof Number || arg instanceof String || arg instanceof Character || arg instanceof Boolean) {// 简单类型
  79. allArgs.put(parameterNames[k], arg);
  80. } else if (arg instanceof Collection) {// 集合
  81. allArgs.put(parameterNames[k], arg);
  82. } else if (arg.getClass().isArray()) {// 数组
  83. allArgs.put(parameterNames[k], JacksonJsonUtils.readObject(JacksonJsonUtils.writeObject(arg),List.class));
  84. } else {// 复杂类型
  85. Map<String, Object> m = JacksonJsonUtils.convertToMap(arg);
  86. if (m != null) {
  87. allArgs.putAll(m);
  88. }
  89. }
  90. }
  91. return allArgs;
  92. }
  93. }