RestLogAspect

  1. @Aspect
  2. @Component
  3. @Slf4j
  4. public class RestLogAspect {
  5. private RestHighLevelClient restHighLevelClient;
  6. private StringRedisTemplate redisTemplate;
  7. private ThreadLocal<RestLog> threadLocal = new ThreadLocal<>();
  8. @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
  9. public void springBeanPointcut() {
  10. }
  11. @Before("springBeanPointcut()")
  12. public void logBefore(JoinPoint joinPoint) {
  13. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  14. if (null == attributes) {
  15. return;
  16. }
  17. HttpServletRequest request = attributes.getRequest();
  18. String paramData = null;
  19. if (!request.getRequestURI().contains("/api/supervise/files")) {
  20. paramData = JSON.toJSONString(request.getParameterMap(), SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue);
  21. }
  22. // 保存接口信息
  23. threadLocal.set(new RestLog(LoggerUtil.getCliectIp(request), request.getRequestURI(), LoggerUtil.getRequestType(request)
  24. , request.getMethod(), joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()
  25. , paramData, request.getRequestedSessionId()));
  26. }
  27. @AfterReturning(value = "springBeanPointcut()", returning = "returnData")
  28. public void logAfter(Object returnData) {
  29. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  30. if (null == attributes) {
  31. return;
  32. }
  33. HttpServletResponse response = attributes.getResponse();
  34. if (null == threadLocal.get() || null == response) {
  35. return;
  36. }
  37. RestLog restLog = threadLocal.get();
  38. // 过滤图片接口请求
  39. if (!restLog.getUri().contains("/api/supervise/files")) {
  40. restLog = threadLocal.get().init(JSON.toJSONString(returnData, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue), response.getStatus());
  41. } else {
  42. restLog = threadLocal.get().init(response.getStatus());
  43. }
  44. this.save(restLog);
  45. // 写进 redis
  46. this.increment(this.getApiKey(restLog.getUri(), restLog.getMethod()));
  47. threadLocal.remove();
  48. }
  49. @AfterThrowing(value = "springBeanPointcut()", throwing = "exception")
  50. public void doAfterThrowingAdvice(Throwable exception) {
  51. if (null == threadLocal.get()) {
  52. return;
  53. }
  54. RestLog restLog = threadLocal.get().exceptionMessage(exception.getMessage());
  55. this.save(restLog);
  56. threadLocal.remove();
  57. }
  58. private void save(RestLog restLog) {
  59. IndexRequest indexRequest = new IndexRequest("rest-supervise-" + DateFormatUtils.format(new Date(), "yyyy.MM.dd"), "doc", UUIDBase64Util.generate());
  60. indexRequest.source(JSON.toJSONString(restLog), XContentType.JSON);
  61. try {
  62. this.restHighLevelClient.index(indexRequest);
  63. } catch (IOException e) {
  64. log.error("RestLogAspect.save IOException:{}", e.getMessage());
  65. }
  66. }
  67. private void increment(String key) {
  68. this.redisTemplate.opsForValue().increment(key, 1);
  69. }
  70. private String getApiKey(String uri, String method) {
  71. return this.handleUri(uri) + "|" + method.toLowerCase() + ":" + DateUtils.formatDate(new Date(), "yyyyMMdd");
  72. }
  73. private String handleUri(String uri) {
  74. StringBuilder stringBuilder = new StringBuilder();
  75. for (String s : uri.split("/")) {
  76. stringBuilder.append("/");
  77. if (s.matches("\\d+") || 22 == s.length()) {
  78. stringBuilder.append("{id}");
  79. } else {
  80. stringBuilder.append(s);
  81. }
  82. }
  83. return stringBuilder.toString().substring(2);
  84. }
  85. @Autowired
  86. public void setRestHighLevelClient(RestHighLevelClient restHighLevelClient) {
  87. this.restHighLevelClient = restHighLevelClient;
  88. }
  89. @Autowired
  90. public void setRedisTemplate(StringRedisTemplate redisTemplate) {
  91. this.redisTemplate = redisTemplate;
  92. }
  93. }

RestStatisticService

  1. public void saveDaily() {
  2. Set<String> keys = this.redisTemplate.keys("api/*");
  3. if (null == keys) {
  4. return;
  5. }
  6. // 将接口调用信息 保存到Redis
  7. keys.forEach(
  8. s -> {
  9. this.restStatisticMapper.insert(new RestStatistic(s, this.redisTemplate.opsForValue().get(s)));
  10. this.redisTemplate.delete(s);
  11. }
  12. );
  13. }