RestLogAspect
@Aspect@Component@Slf4jpublic class RestLogAspect { private RestHighLevelClient restHighLevelClient; private StringRedisTemplate redisTemplate; private ThreadLocal<RestLog> threadLocal = new ThreadLocal<>(); @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)") public void springBeanPointcut() { } @Before("springBeanPointcut()") public void logBefore(JoinPoint joinPoint) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (null == attributes) { return; } HttpServletRequest request = attributes.getRequest(); String paramData = null; if (!request.getRequestURI().contains("/api/supervise/files")) { paramData = JSON.toJSONString(request.getParameterMap(), SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue); } // 保存接口信息 threadLocal.set(new RestLog(LoggerUtil.getCliectIp(request), request.getRequestURI(), LoggerUtil.getRequestType(request) , request.getMethod(), joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName() , paramData, request.getRequestedSessionId())); } @AfterReturning(value = "springBeanPointcut()", returning = "returnData") public void logAfter(Object returnData) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (null == attributes) { return; } HttpServletResponse response = attributes.getResponse(); if (null == threadLocal.get() || null == response) { return; } RestLog restLog = threadLocal.get(); // 过滤图片接口请求 if (!restLog.getUri().contains("/api/supervise/files")) { restLog = threadLocal.get().init(JSON.toJSONString(returnData, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue), response.getStatus()); } else { restLog = threadLocal.get().init(response.getStatus()); } this.save(restLog); // 写进 redis this.increment(this.getApiKey(restLog.getUri(), restLog.getMethod())); threadLocal.remove(); } @AfterThrowing(value = "springBeanPointcut()", throwing = "exception") public void doAfterThrowingAdvice(Throwable exception) { if (null == threadLocal.get()) { return; } RestLog restLog = threadLocal.get().exceptionMessage(exception.getMessage()); this.save(restLog); threadLocal.remove(); } private void save(RestLog restLog) { IndexRequest indexRequest = new IndexRequest("rest-supervise-" + DateFormatUtils.format(new Date(), "yyyy.MM.dd"), "doc", UUIDBase64Util.generate()); indexRequest.source(JSON.toJSONString(restLog), XContentType.JSON); try { this.restHighLevelClient.index(indexRequest); } catch (IOException e) { log.error("RestLogAspect.save IOException:{}", e.getMessage()); } } private void increment(String key) { this.redisTemplate.opsForValue().increment(key, 1); } private String getApiKey(String uri, String method) { return this.handleUri(uri) + "|" + method.toLowerCase() + ":" + DateUtils.formatDate(new Date(), "yyyyMMdd"); } private String handleUri(String uri) { StringBuilder stringBuilder = new StringBuilder(); for (String s : uri.split("/")) { stringBuilder.append("/"); if (s.matches("\\d+") || 22 == s.length()) { stringBuilder.append("{id}"); } else { stringBuilder.append(s); } } return stringBuilder.toString().substring(2); } @Autowired public void setRestHighLevelClient(RestHighLevelClient restHighLevelClient) { this.restHighLevelClient = restHighLevelClient; } @Autowired public void setRedisTemplate(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; }}
RestStatisticService
public void saveDaily() { Set<String> keys = this.redisTemplate.keys("api/*"); if (null == keys) { return; } // 将接口调用信息 保存到Redis keys.forEach( s -> { this.restStatisticMapper.insert(new RestStatistic(s, this.redisTemplate.opsForValue().get(s))); this.redisTemplate.delete(s); } ); }