Commit 0efb2eb7 by inrgihc

接口日志自动清理

parent 396ffd9b
...@@ -3,53 +3,46 @@ ...@@ -3,53 +3,46 @@
![SQLREST](docs/images/SQLREST.PNG#pic_center) ![SQLREST](docs/images/SQLREST.PNG#pic_center)
> 将数据库可执行的SQL直接RESTful风格的http接口的便捷工具 > 将 SQL 查询转化为 RESTful API的便捷工具
## 一、工具介绍 ## 一、工具介绍
### 1、功能介绍 SQLREST 是一个开源项目,旨在提供一种简单而强大的方式来将 SQL 查询转化为 RESTful API。它支持多种数据库,允许用户通过配置 SQL 语句来创建 API,无
需编写复杂的后端逻辑,用户只需选择数据源、输入SQL或脚本、简单path配置即可快速生成API接口。
一句话, sqlrest提供利用SQL快速构建RESTful接口的工具,包括SQl方式和Groovy脚本方式。用户只需选择数据
源、输入SQL或脚本、简单path配置即可快速生成API接口。具体功能包括:
- Mybatis的SQL方式构建RESTful接口
> 提供类似mybatis的动态SQL语法方式构建接口。
- Groovy脚本方式构建RESTful接口
> 基于groovy脚本的语法方式构建复杂场景下的接口。
- 支持接口的token安全认证功能 ### 1、功能介绍
> 执行器支持生成token及token认证。
- 支持接口的x-www-form-urlencoded和JSON入参格式
> HTTP入参支持application/x-www-form-urlencoded及application/json等请求格式。
- 接口入参出参支持基本、对象及对象等多种类型
> HTTP入参出参支持整型/浮点型/时间/日期/布尔/字符串/对象等多种类型
- 支持自动生成在线接口文档功能 SQLREST的功能包括:
> 基于swagger-ui提供自动生成在线接口文档功能。
- 支持接口缓存配置功能 - **SQL直接构建API**:通过配置SQL和参数即可生成 RESTful API。
> 执行器基于Hazelcast/Redis支持接口的缓存配置功能。 - **多数据库支持**:支持常见的20+种数据库,其中包含多款国产数据库。
- **MyBatis语法支持**:支持MyBatis的动态SQL语法。
- **Groovy脚本支持**:支持groovy语法构建复杂场景下的接口。
- **参数类型支持**:支持整型/浮点型/时间/日期/布尔/字符串/对象等多种类型。
- **ContentType支持**:支持application/x-www-form-urlencoded及application/json等多种请求格式。
- **身份认证**:提供基于 Token 的认证机制,保护 API 安全。
- **Swagger在线文档**:支持自动生成swagger-ui的在线接口文档。
- **缓存配置支持**:支持 Hazelcast 和 Redis 缓存,提升 API 访问性能。
- **流控配置管理**:通过 Sentinel 支持流量控制,防止系统过载。
- **统一告警对接**:支持统一告警系统的对接与触发。
- **大模型MCP服务**:支持简单配置即可创建MCP的tool。
- 支持接口的流量控制功能 SQLREST作为微服务架构下的数据访问中间件,适合以下场景:
> 执行器基于sentinel支持接口的流量控制功能。
- 支持接口异常触发告警功能 - **快速将 SQL 转换为 API**
> 简单配置即可对接已有的告警平台,支持接口异常时的告警功能。 - **企业级数据库访问统一接口**
- **API 访问控制与流控**
- **适用于数据中台、BI 工具、低代码平台等**
- 支持作为大模型MCP服务断快速创建tool ### 2、数据库清单
> 基于已有接口,简单配置即可快速创建MCP的tool,为大模型提供MCP服务端工具。
### 2、支持的数据库 截至当前,已支持的数据库包括:
- 甲骨文的Oracle - 甲骨文的Oracle
- 微软的Microsoft SQLServer - 微软的Microsoft SQLServer(2005+)
- MySQL - MySQL
- MariaDB - MariaDB
- PostgreSQL - PostgreSQL/Greenplum
- Greenplum(需使用PostgreSQL类型)
- IBM的DB2 - IBM的DB2
- Sybase数据库 - Sybase数据库
- 国产达梦数据库DM - 国产达梦数据库DM
...@@ -87,18 +80,14 @@ ...@@ -87,18 +80,14 @@
### 4、正在规划中的功能 ### 4、正在规划中的功能
- (1) 接口检索功能 - **接口检索功能**: 支持类似百度搜索的接口搜索功能,方便接口查找。
> 支持类似百度搜索的接口搜索功能,方便接口查找 - **接口详情功能**:支持接口的详细定义、数据来源、访问分析等功能。
- **前端界面美化**: 美化界面的交互展示,尤其是“拓扑结构”页面。
- (2) 接口详情功能 - **增强SQ语法自动提示**: 在实现的库名表名提示的基础上,基于数据库元信息的增强智能提示,强化用户体验。
> 支持接口的详细定义、数据来源、访问分析等功能
- (3) 前端界面整体美化
> 美化界面的交互展示,尤其是“拓扑结构”页面。
## 二、编译打包 ## 二、编译打包
本工具纯Java语言开发,依赖全部来自于开源项目。 本工具纯Java语言开发,依赖全部来自于开源项目。SQLREST项目采用Maven构建。
### 1、编译打包 ### 1、编译打包
...@@ -190,7 +179,7 @@ MYSQLDB_PASSWORD=123456 ...@@ -190,7 +179,7 @@ MYSQLDB_PASSWORD=123456
``` ```
>sqlrest的缓存支持使用分布式的hazelcast或者redis,在conf/{manager,gateway,executor}/目录下的application.yml配 >sqlrest的缓存支持使用分布式的hazelcast或者redis,在conf/{manager,gateway,executor}/目录下的application.yml配
>置文件中,可通过如下调整配置实用redis缓存,默认为使用hazelcast缓存。 >置文件中,可通过如下调整配置实用redis缓存,默认为使用hazelcast缓存(注意:manager/gateway/executor三者的缓存配置要一致)
``` ```
sqlrest: sqlrest:
...@@ -253,10 +242,6 @@ sqlrest: ...@@ -253,10 +242,6 @@ sqlrest:
![006.png](docs/images/006.PNG) ![006.png](docs/images/006.PNG)
![007.png](docs/images/007.PNG)
![008.png](docs/images/008.PNG)
![009.png](docs/images/009.PNG) ![009.png](docs/images/009.PNG)
![010.png](docs/images/010.PNG) ![010.png](docs/images/010.PNG)
...@@ -265,7 +250,13 @@ sqlrest: ...@@ -265,7 +250,13 @@ sqlrest:
## 四、贡献参与 ## 四、贡献参与
为了能让项目得到更好的可持续的发展,sqlrest期望获得更多的代码开发爱好者参与代码贡献,具体可参考文档说明:[贡献说明指南](https://gitee.com/inrgihc/dbswitch/blob/master/CONTRIBUTE.md) 为了能让项目得到更好的可持续的发展,SQLREST期望获得更多的代码开发爱好者参与代码贡献,包括但不限于:
- 改进前端 UI/UX
- 修复 bug 和性能优化
- 增加新的易用性功能
贡献操作文档参考:[贡献说明指南](https://gitee.com/inrgihc/dbswitch/blob/master/CONTRIBUTE.md)
## 五、项目推荐 ## 五、项目推荐
......
...@@ -39,6 +39,7 @@ logging: ...@@ -39,6 +39,7 @@ logging:
eureka: eureka:
instance: instance:
ip-address: ${MANAGER_HOST}
prefer-ip-address: true prefer-ip-address: true
secure-port-enabled: false secure-port-enabled: false
non-secure-port-enabled: true non-secure-port-enabled: true
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
</rollingPolicy> </rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
......
...@@ -72,6 +72,7 @@ logging: ...@@ -72,6 +72,7 @@ logging:
eureka: eureka:
instance: instance:
ip-address: ${MANAGER_HOST}
prefer-ip-address: true prefer-ip-address: true
secure-port-enabled: false secure-port-enabled: false
non-secure-port-enabled: true non-secure-port-enabled: true
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
</rollingPolicy> </rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
......
...@@ -48,6 +48,7 @@ eureka: ...@@ -48,6 +48,7 @@ eureka:
enabled: false enabled: false
path: /dashboard path: /dashboard
instance: instance:
ip-address: ${MANAGER_HOST}
prefer-ip-address: true prefer-ip-address: true
secure-port-enabled: false secure-port-enabled: false
non-secure-port-enabled: true non-secure-port-enabled: true
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
...@@ -31,10 +31,15 @@ ...@@ -31,10 +31,15 @@
</rollingPolicy> </rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
<logger name="com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient" level="ERROR"/>
<logger name="com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient" level="ERROR"/>
<logger name="com.netflix.discovery.DiscoveryClient" level="OFF"/>
<logger name="com.netflix.discovery.InstanceInfoReplicator" level="ERROR"/>
<!-- 日志输出级别 --> <!-- 日志输出级别 -->
<root level="INFO"> <root level="INFO">
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
......
...@@ -39,6 +39,7 @@ logging: ...@@ -39,6 +39,7 @@ logging:
eureka: eureka:
instance: instance:
ip-address: ${MANAGER_HOST}
prefer-ip-address: true prefer-ip-address: true
secure-port-enabled: false secure-port-enabled: false
non-secure-port-enabled: true non-secure-port-enabled: true
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
</rollingPolicy> </rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
......
...@@ -72,6 +72,7 @@ logging: ...@@ -72,6 +72,7 @@ logging:
eureka: eureka:
instance: instance:
ip-address: ${MANAGER_HOST}
prefer-ip-address: true prefer-ip-address: true
secure-port-enabled: false secure-port-enabled: false
non-secure-port-enabled: true non-secure-port-enabled: true
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
</rollingPolicy> </rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.config;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@Configuration
public class SchedulingConfiguration implements SchedulingConfigurer {
@Bean("managerTaskScheduler")
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
executor.setPoolSize(10);
executor.setThreadNamePrefix("scheduler-task-thread-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
}
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
// Date : 2024/3/31 // Date : 2024/3/31
// Location: beijing , china // Location: beijing , china
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.service; package com.gitee.sqlrest.manager.model;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.service;
import com.gitee.sqlrest.persistence.mapper.AccessRecordMapper;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class AccessLogCleanService {
@Value("${access.log.clean.days:30}")
private Integer cleanJobLogDays;
@Resource
private AccessRecordMapper accessRecordMapper;
@EventListener(ApplicationReadyEvent.class)
public void cleanOnceAfterRestart() {
doCleanHistoryLog();
}
@Scheduled(cron = "0 0 0 * * ? ")
public void cleanSchedule() {
doCleanHistoryLog();
}
private void doCleanHistoryLog() {
try {
accessRecordMapper.deleteHistoryBeforeDays(cleanJobLogDays);
log.info("Success to clean history access log for {} days", cleanJobLogDays);
} catch (Throwable t) {
log.error("Failed to clean history access log,", t);
}
}
}
...@@ -18,6 +18,7 @@ import com.gitee.sqlrest.common.util.TokenUtils; ...@@ -18,6 +18,7 @@ import com.gitee.sqlrest.common.util.TokenUtils;
import com.gitee.sqlrest.core.dto.EntitySearchRequest; import com.gitee.sqlrest.core.dto.EntitySearchRequest;
import com.gitee.sqlrest.core.dto.McpToolResponse; import com.gitee.sqlrest.core.dto.McpToolResponse;
import com.gitee.sqlrest.core.dto.McpToolSaveRequest; import com.gitee.sqlrest.core.dto.McpToolSaveRequest;
import com.gitee.sqlrest.manager.model.McpToolCallHandler;
import com.gitee.sqlrest.persistence.dao.ApiAssignmentDao; import com.gitee.sqlrest.persistence.dao.ApiAssignmentDao;
import com.gitee.sqlrest.persistence.dao.ApiModuleDao; import com.gitee.sqlrest.persistence.dao.ApiModuleDao;
import com.gitee.sqlrest.persistence.dao.McpClientDao; import com.gitee.sqlrest.persistence.dao.McpClientDao;
......
...@@ -48,6 +48,7 @@ eureka: ...@@ -48,6 +48,7 @@ eureka:
enabled: false enabled: false
path: /dashboard path: /dashboard
instance: instance:
ip-address: ${MANAGER_HOST}
prefer-ip-address: true prefer-ip-address: true
secure-port-enabled: false secure-port-enabled: false
non-secure-port-enabled: true non-secure-port-enabled: true
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
...@@ -31,10 +31,15 @@ ...@@ -31,10 +31,15 @@
</rollingPolicy> </rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern> <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
<logger name="com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient" level="ERROR"/>
<logger name="com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient" level="ERROR"/>
<logger name="com.netflix.discovery.DiscoveryClient" level="OFF"/>
<logger name="com.netflix.discovery.InstanceInfoReplicator" level="ERROR"/>
<!-- 日志输出级别 --> <!-- 日志输出级别 -->
<root level="INFO"> <root level="INFO">
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
......
...@@ -15,6 +15,7 @@ import com.gitee.sqlrest.common.dto.NameCount; ...@@ -15,6 +15,7 @@ import com.gitee.sqlrest.common.dto.NameCount;
import com.gitee.sqlrest.persistence.entity.AccessRecordEntity; import com.gitee.sqlrest.persistence.entity.AccessRecordEntity;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
...@@ -71,10 +72,17 @@ public interface AccessRecordMapper extends BaseMapper<AccessRecordEntity> { ...@@ -71,10 +72,17 @@ public interface AccessRecordMapper extends BaseMapper<AccessRecordEntity> {
+ " count(*) as total, " + " count(*) as total, "
+ " sum(success) as success " + " sum(success) as success "
+ "FROM ( " + "FROM ( "
+ " SELECT id,path,case when status=200 then 1 else 0 end as success, create_time FROM SQLREST_ACCESS_RECORD " + " SELECT id,path,case when status=200 then 1 else 0 end as success, create_time "
+ " FROM SQLREST_ACCESS_RECORD "
+ " WHERE DATE_SUB( CURDATE(), INTERVAL ${days} DAY ) &lt;= date(create_time) " + " WHERE DATE_SUB( CURDATE(), INTERVAL ${days} DAY ) &lt;= date(create_time) "
+ " ) t " + " ) t "
+ " GROUP BY of_date" + " GROUP BY of_date"
+ "</script>") + "</script>")
List<DateCount> getDailyTrend(@Param("days") Integer days); List<DateCount> getDailyTrend(@Param("days") Integer days);
@Delete("<script>"
+ "DELETE FROM SQLREST_ACCESS_RECORD "
+ "WHERE date(create_time) &lt;= DATE_SUB( CURDATE(), INTERVAL ${days} DAY ) "
+ "</script>")
void deleteHistoryBeforeDays(@Param("days") Integer days);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment