diff --git a/service-configuration/src/main/java/com/lanyuanxiaoyao/service/configuration/entity/info/SQLLine.java b/service-configuration/src/main/java/com/lanyuanxiaoyao/service/configuration/entity/info/SQLLine.java new file mode 100644 index 0000000..9350520 --- /dev/null +++ b/service-configuration/src/main/java/com/lanyuanxiaoyao/service/configuration/entity/info/SQLLine.java @@ -0,0 +1,46 @@ +package com.lanyuanxiaoyao.service.configuration.entity.info; + +import java.time.Instant; + +/** + * SQL + * + * @author lanyuanxiaoyao + * @date 2023-07-11 + */ +public class SQLLine { + private String sql; + private Long createTime; + + public SQLLine() { + } + + public SQLLine(String sql) { + this.sql = sql; + this.createTime = Instant.now().toEpochMilli(); + } + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "SQLLine{" + + "sql='" + sql + '\'' + + ", createTime=" + createTime + + '}'; + } +} diff --git a/service-info-query/pom.xml b/service-info-query/pom.xml index a83c333..b83f527 100644 --- a/service-info-query/pom.xml +++ b/service-info-query/pom.xml @@ -27,6 +27,10 @@ database 1.0.0-SNAPSHOT + + org.springframework.boot + spring-boot-starter-aop + com.alibaba druid-spring-boot-starter diff --git a/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/configuration/SQLLoggerAdvice.java b/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/configuration/SQLLoggerAdvice.java new file mode 100644 index 0000000..663ce82 --- /dev/null +++ b/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/configuration/SQLLoggerAdvice.java @@ -0,0 +1,36 @@ +package com.lanyuanxiaoyao.service.info.configuration; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.stereotype.Component; + +/** + * SQL记录 + * + * @author lanyuanxiaoyao + * @date 2023-07-11 + */ +@Aspect +@Component +@EnableAspectJAutoProxy +public class SQLLoggerAdvice { + private static final Logger logger = LoggerFactory.getLogger(SQLLoggerAdvice.class); + private final SQLLoggerProvider.SQLLogger sqlLogger; + + public SQLLoggerAdvice(SQLLoggerProvider.SQLLogger sqlLogger) { + this.sqlLogger = sqlLogger; + } + + @Around("execution(* org.springframework.jdbc.core.JdbcTemplate.query(String, org.springframework.jdbc.core.ResultSetExtractor))") + public Object around(ProceedingJoinPoint joinPoint) throws Throwable { + Object[] args = joinPoint.getArgs(); + if (args != null && args.length > 0 && args[0] instanceof String) { + sqlLogger.log((String) args[0]); + } + return joinPoint.proceed(); + } +} diff --git a/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/configuration/SQLLoggerProvider.java b/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/configuration/SQLLoggerProvider.java new file mode 100644 index 0000000..93ffa96 --- /dev/null +++ b/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/configuration/SQLLoggerProvider.java @@ -0,0 +1,44 @@ +package com.lanyuanxiaoyao.service.info.configuration; + +import com.lanyuanxiaoyao.service.configuration.entity.info.SQLLine; +import java.time.Instant; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import org.eclipse.collections.api.factory.Lists; +import org.eclipse.collections.api.list.ImmutableList; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * SQL记录 + * + * @author lanyuanxiaoyao + * @date 2023-07-11 + */ +@Configuration +public class SQLLoggerProvider { + public static final class SQLLogger { + private final int size; + private final Queue container = new ConcurrentLinkedQueue<>(); + + public SQLLogger(int size) { + this.size = size; + } + + public void log(String sql) { + if (container.size() >= size) { + container.poll(); + } + container.add(new SQLLine(sql)); + } + + public ImmutableList getLogs() { + return Lists.immutable.ofAll(container); + } + } + + @Bean + public SQLLogger sqlLogger() { + return new SQLLogger(200); + } +} diff --git a/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/controller/LogController.java b/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/controller/LogController.java new file mode 100644 index 0000000..cfd77a7 --- /dev/null +++ b/service-info-query/src/main/java/com/lanyuanxiaoyao/service/info/controller/LogController.java @@ -0,0 +1,33 @@ +package com.lanyuanxiaoyao.service.info.controller; + +import com.lanyuanxiaoyao.service.configuration.entity.info.SQLLine; +import com.lanyuanxiaoyao.service.info.configuration.SQLLoggerProvider; +import org.eclipse.collections.api.list.ImmutableList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Sql 日志 + * + * @author lanyuanxiaoyao + * @date 2023-07-11 + */ +@RestController +@RequestMapping("logs") +public class LogController { + private static final Logger logger = LoggerFactory.getLogger(LogController.class); + + private final SQLLoggerProvider.SQLLogger sqlLogger; + + public LogController(SQLLoggerProvider.SQLLogger sqlLogger) { + this.sqlLogger = sqlLogger; + } + + @GetMapping("") + public ImmutableList logs() { + return sqlLogger.getLogs(); + } +} diff --git a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/LogController.java b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/LogController.java index 6f4447b..c78c318 100644 --- a/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/LogController.java +++ b/service-web/src/main/java/com/lanyuanxiaoyao/service/web/controller/LogController.java @@ -2,7 +2,9 @@ package com.lanyuanxiaoyao.service.web.controller; import cn.hutool.core.map.MapUtil; import com.lanyuanxiaoyao.service.configuration.entity.loki.LokiLogLine; +import com.lanyuanxiaoyao.service.forest.service.InfoService; import com.lanyuanxiaoyao.service.forest.service.LokiService; +import com.lanyuanxiaoyao.service.web.controller.base.AmisCrudResponse; import com.lanyuanxiaoyao.service.web.controller.base.AmisDetailResponse; import com.lanyuanxiaoyao.service.web.controller.base.AmisResponse; import com.lanyuanxiaoyao.service.web.controller.base.BaseController; @@ -25,10 +27,12 @@ public class LogController extends BaseController { private static final Logger logger = LoggerFactory.getLogger(LogController.class); private final LokiService lokiService; + private final InfoService infoService; @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - public LogController(LokiService lokiService) { + public LogController(LokiService lokiService, InfoService infoService) { this.lokiService = lokiService; + this.infoService = infoService; } private String preHandle(String line) { @@ -74,4 +78,9 @@ public class LogController extends BaseController { .collect(this::preHandle) .makeString("\n")); } + + @GetMapping("query_sql_log") + public AmisCrudResponse querySQLLog() { + return AmisResponse.responseCrudData(infoService.sqlLogs()); + } }