diff --git a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/config/YudaoQuartzAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/config/YudaoQuartzAutoConfiguration.java index aaf4fe5c4..0f82712a2 100644 --- a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/config/YudaoQuartzAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/config/YudaoQuartzAutoConfiguration.java @@ -1,9 +1,12 @@ package cn.iocoder.yudao.framework.quartz.config; +import cn.iocoder.yudao.framework.quartz.core.job.JobLogJobHandler; +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties; import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; import lombok.extern.slf4j.Slf4j; import org.quartz.Scheduler; import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; @@ -15,6 +18,7 @@ import java.util.Optional; @AutoConfiguration @EnableScheduling // 开启 Spring 自带的定时任务 @Slf4j +@EnableConfigurationProperties(LogJobProperties.class) public class YudaoQuartzAutoConfiguration { @Bean @@ -26,4 +30,9 @@ public class YudaoQuartzAutoConfiguration { return new SchedulerManager(scheduler.get()); } + @Bean + public JobLogJobHandler jobLogJobHandler(LogJobProperties logJobProperties){ + return new JobLogJobHandler(logJobProperties); + } + } diff --git a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/JobLogJobHandler.java b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/JobLogJobHandler.java new file mode 100644 index 000000000..53565102d --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/JobLogJobHandler.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.framework.quartz.core.job; + +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.framework.quartz.core.service.JobLogFrameworkService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Resource; + +/** + * @Author: j-sentinel + * @Date: 2023/9/30 20:40 + */ +@Slf4j +@AllArgsConstructor +public class JobLogJobHandler implements JobHandler { + + private LogJobProperties logJobProperties; + + public JobLogJobHandler(LogJobProperties logJobProperties) { + this.logJobProperties = logJobProperties; + } + + @Resource + private JobLogFrameworkService jobLogFrameworkService; + + @Override + public String execute(String param) throws Exception { + Integer integer = jobLogFrameworkService.timingJobCleanLog(logJobProperties.getJobCleanRetainDay()); + log.info("定时执行清理定时任务日志数量({})个",integer); + return String.format("定时执行清理定时任务日志数量 %s 个", integer); + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/LogJobProperties.java b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/LogJobProperties.java new file mode 100644 index 000000000..f563fec19 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/LogJobProperties.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.framework.quartz.core.job; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @Author: j-sentinel + * @Date: 2023/9/30 16:17 + */ +@Data +@ConfigurationProperties(prefix = "yudao.clean-job") +public class LogJobProperties { + + private int accessRetainDay = 7; + + private int errorRetainDay = 8; + + private int jobCleanRetainDay = 7; + +} diff --git a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java index 889921dfd..45de8cea0 100644 --- a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java +++ b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java @@ -41,4 +41,10 @@ public interface JobLogFrameworkService { @NotNull(message = "运行时长不能为空") Integer duration, boolean success, String result); + /** + * 清理 @param jobCleanRetainDay 天的访问日志 + * + * @param jobCleanRetainDay 超过多少天就进行清理 + */ + Integer timingJobCleanLog(Integer jobCleanRetainDay); } diff --git a/yudao-framework/yudao-spring-boot-starter-web/pom.xml b/yudao-framework/yudao-spring-boot-starter-web/pom.xml index 50d986c06..b345fb31e 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-web/pom.xml @@ -61,6 +61,12 @@ <artifactId>jsoup</artifactId> </dependency> + <!-- Job 定时任务相关 --> + <dependency> + <groupId>cn.iocoder.boot</groupId> + <artifactId>yudao-spring-boot-starter-job</artifactId> + </dependency> + </dependencies> </project> diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java index 6ced68756..b8e18b18d 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java @@ -1,11 +1,14 @@ package cn.iocoder.yudao.framework.apilog.config; import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter; +import cn.iocoder.yudao.framework.apilog.core.job.ApiAccessLogJobHandler; +import cn.iocoder.yudao.framework.apilog.core.job.ApiErrorLogJobHandler; import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl; import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl; import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties; import cn.iocoder.yudao.framework.web.config.WebProperties; import cn.iocoder.yudao.framework.web.config.YudaoWebAutoConfiguration; import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; @@ -31,6 +34,16 @@ public class YudaoApiLogAutoConfiguration { return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi); } + @Bean + public ApiAccessLogJobHandler apiAccessLogJobHandler(LogJobProperties logJobProperties) { + return new ApiAccessLogJobHandler(logJobProperties); + } + + @Bean + public ApiErrorLogJobHandler apiErrorLogJobHandler(LogJobProperties logJobProperties) { + return new ApiErrorLogJobHandler(logJobProperties); + } + /** * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 */ diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiAccessLogJobHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiAccessLogJobHandler.java new file mode 100644 index 000000000..f6d512fa0 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiAccessLogJobHandler.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.framework.apilog.core.job; + +import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Resource; + +/** + * @Author: j-sentinel + * @Date: 2023/9/30 16:13 + */ +@Slf4j +@AllArgsConstructor +public class ApiAccessLogJobHandler implements JobHandler { + + private LogJobProperties logJobProperties; + + public ApiAccessLogJobHandler(LogJobProperties logJobProperties) { + this.logJobProperties = logJobProperties; + } + + @Resource + private ApiAccessLogFrameworkService apiAccessLogFrameworkService; + + @Override + public String execute(String param) throws Exception { + apiAccessLogFrameworkService.jobCleanAccessLog(logJobProperties.getAccessRetainDay()); + return ""; + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiErrorLogJobHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiErrorLogJobHandler.java new file mode 100644 index 000000000..adbfa45b6 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiErrorLogJobHandler.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.framework.apilog.core.job; + +import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Resource; + +/** + * @Author: j-sentinel + * @Date: 2023/9/30 16:13 + */ +@Slf4j +@AllArgsConstructor +public class ApiErrorLogJobHandler implements JobHandler { + + private LogJobProperties logJobProperties; + + public ApiErrorLogJobHandler(LogJobProperties logJobProperties) { + this.logJobProperties = logJobProperties; + } + + @Resource + private ApiErrorLogFrameworkService apiErrorLogFrameworkService; + + @Override + public String execute(String param) throws Exception { + apiErrorLogFrameworkService.jobCleanErrorLog(logJobProperties.getErrorRetainDay()); + return ""; + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkService.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkService.java index 9bfc3a573..b9de0b680 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkService.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkService.java @@ -14,4 +14,10 @@ public interface ApiAccessLogFrameworkService { */ void createApiAccessLog(ApiAccessLog apiAccessLog); + /** + * 清理 @param accessLogJobDay 天的访问日志 + * + * @param accessLogJobDay 超过多少天就进行清理 + */ + void jobCleanAccessLog(Integer accessLogJobDay); } diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java index 83162f164..e8a948c14 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java @@ -25,4 +25,9 @@ public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkSe apiAccessLogApi.createApiAccessLog(reqDTO); } + @Override + public void jobCleanAccessLog(Integer accessLogJobDay) { + apiAccessLogApi.jobCleanAccessLog(accessLogJobDay); + } + } diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkService.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkService.java index 403c574bc..fb4e1b029 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkService.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkService.java @@ -14,4 +14,10 @@ public interface ApiErrorLogFrameworkService { */ void createApiErrorLog(ApiErrorLog apiErrorLog); + /** + * 清理 @param errorLogJobDay 天的访问日志 + * + * @param errorLogJobDay 超过多少天就进行清理 + */ + void jobCleanErrorLog(Integer errorLogJobDay); } diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java index cb5abe3c2..dfcdc7edd 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java @@ -25,4 +25,9 @@ public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkServ apiErrorLogApi.createApiErrorLog(reqDTO); } + @Override + public void jobCleanErrorLog(Integer errorLogJobDay) { + apiErrorLogApi.jobCleanErrorLog(errorLogJobDay); + } + } diff --git a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApi.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApi.java index ed3f3ee1e..63a1f3899 100644 --- a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApi.java +++ b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApi.java @@ -18,4 +18,10 @@ public interface ApiAccessLogApi { */ void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO); + /** + * 清理 @param accessLogJobDay 天的访问日志 + * + * @param accessLogJobDay 超过多少天就进行清理 + */ + void jobCleanAccessLog(Integer accessLogJobDay); } diff --git a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApi.java b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApi.java index 9b53c6643..7554461be 100644 --- a/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApi.java +++ b/yudao-module-infra/yudao-module-infra-api/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApi.java @@ -18,4 +18,10 @@ public interface ApiErrorLogApi { */ void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO); + /** + * 清理 @param errorLogJobDay 天的访问日志 + * + * @param errorLogJobDay 超过多少天就进行清理 + */ + void jobCleanErrorLog(Integer errorLogJobDay); } diff --git a/yudao-module-infra/yudao-module-infra-biz/pom.xml b/yudao-module-infra/yudao-module-infra-biz/pom.xml index 6d7ac0cff..af5fb9ac2 100644 --- a/yudao-module-infra/yudao-module-infra-biz/pom.xml +++ b/yudao-module-infra/yudao-module-infra-biz/pom.xml @@ -35,6 +35,10 @@ <groupId>cn.iocoder.boot</groupId> <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> </dependency> + <dependency> + <groupId>cn.iocoder.boot</groupId> + <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId> + </dependency> <!-- Web 相关 --> <dependency> diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApiImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApiImpl.java index 2daa4a1c4..283bfc12f 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApiImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiAccessLogApiImpl.java @@ -24,4 +24,9 @@ public class ApiAccessLogApiImpl implements ApiAccessLogApi { apiAccessLogService.createApiAccessLog(createDTO); } + @Override + public void jobCleanAccessLog(Integer accessLogJobDay) { + apiAccessLogService.jobCleanAccessLog(accessLogJobDay); + } + } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApiImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApiImpl.java index cdb0ec293..e1043b7de 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApiImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/api/logger/ApiErrorLogApiImpl.java @@ -24,4 +24,9 @@ public class ApiErrorLogApiImpl implements ApiErrorLogApi { apiErrorLogService.createApiErrorLog(createDTO); } + @Override + public void jobCleanErrorLog(Integer errorLogJobDay) { + apiErrorLogService.jobCleanErrorLog(errorLogJobDay); + } + } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java index c467498bf..377136a82 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReq import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -40,4 +41,7 @@ public interface JobLogMapper extends BaseMapperX<JobLogDO> { ); } + Integer timingJobCleanLog(@Param("jobCleanRetainDay") Integer jobCleanRetainDay); + + void optimizeTable(); } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java index 427675636..dd3107407 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.Api import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -44,4 +45,7 @@ public interface ApiAccessLogMapper extends BaseMapperX<ApiAccessLogDO> { ); } + Integer jobCleanAccessLog(@Param("accessLogJobDay") Integer accessLogJobDay); + + void optimizeTable(); } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java index e9748b624..617247d7d 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiE import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -42,4 +43,7 @@ public interface ApiErrorLogMapper extends BaseMapperX<ApiErrorLogDO> { ); } + Integer jobCleanErrorLog(@Param("errorLogJobDay") Integer errorLogJobDay); + + void optimizeTable(); } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java index dcf8d302b..353860bd5 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java @@ -26,6 +26,8 @@ import java.util.List; @Slf4j public class JobLogServiceImpl implements JobLogService { + private static final Integer DELETE_LIMIT = 1; + @Resource private JobLogMapper jobLogMapper; @@ -50,6 +52,22 @@ public class JobLogServiceImpl implements JobLogService { } } + @Override + public Integer timingJobCleanLog(Integer jobCleanRetainDay) { + Integer result = null; + int count = 0; + while (result == null || DELETE_LIMIT.equals(result)){ + result = jobLogMapper.timingJobCleanLog(jobCleanRetainDay); + count += result; + } + if(count > 0){ + // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。 + // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。 + jobLogMapper.optimizeTable(); + } + return count; + } + @Override public JobLogDO getJobLog(Long id) { return jobLogMapper.selectById(id); diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java index e473b2322..7292f1273 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java @@ -38,4 +38,10 @@ public interface ApiAccessLogService { */ List<ApiAccessLogDO> getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO); + /** + * 清理 @param accessLogJobDay 天的访问日志 + * + * @param accessLogJobDay 超过多少天就进行清理 + */ + void jobCleanAccessLog(Integer accessLogJobDay); } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java index e3b3234ee..8863aea05 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java @@ -1,12 +1,14 @@ package cn.iocoder.yudao.module.infra.service.logger; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; import cn.iocoder.yudao.module.infra.convert.logger.ApiAccessLogConvert; import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -18,10 +20,13 @@ import java.util.List; * * @author 芋道源码 */ +@Slf4j @Service @Validated public class ApiAccessLogServiceImpl implements ApiAccessLogService { + private static final Integer DELETE_LIMIT = 100; + @Resource private ApiAccessLogMapper apiAccessLogMapper; @@ -41,4 +46,22 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService { return apiAccessLogMapper.selectList(exportReqVO); } + @Override + public void jobCleanAccessLog(Integer accessLogJobDay) { + TenantUtils.executeIgnore(() -> { + Integer result = null; + int count = 0; + while (result == null || DELETE_LIMIT.equals(result)) { + result = apiAccessLogMapper.jobCleanAccessLog(accessLogJobDay); + count += result; + } + if (count > 0) { + // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。 + // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。 + apiAccessLogMapper.optimizeTable(); + } + log.info("定时执行清理访问日志数量({})个", count); + }); + } + } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java index 138c9bef4..4dd881e1f 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java @@ -47,4 +47,10 @@ public interface ApiErrorLogService { */ void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId); + /** + * 清理 @param errorLogJobDay 天的访问日志 + * + * @param errorLogJobDay 超过多少天就进行清理 + */ + void jobCleanErrorLog(Integer errorLogJobDay); } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java index c0f9252af..fc74c7112 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.infra.service.logger; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; @@ -8,6 +9,7 @@ import cn.iocoder.yudao.module.infra.convert.logger.ApiErrorLogConvert; import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper; import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -24,10 +26,13 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.API_ERROR_L * * @author 芋道源码 */ +@Slf4j @Service @Validated public class ApiErrorLogServiceImpl implements ApiErrorLogService { + private static final Integer DELETE_LIMIT = 100; + @Resource private ApiErrorLogMapper apiErrorLogMapper; @@ -62,4 +67,22 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService { .processUserId(processUserId).processTime(LocalDateTime.now()).build()); } + @Override + public void jobCleanErrorLog(Integer errorLogJobDay) { + TenantUtils.executeIgnore(() -> { + Integer result = null; + int count = 0; + while (result == null || DELETE_LIMIT.equals(result)) { + result = apiErrorLogMapper.jobCleanErrorLog(errorLogJobDay); + count += result; + } + if (count > 0) { + // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。 + // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。 + apiErrorLogMapper.optimizeTable(); + } + log.info("定时执行清理错误日志数量({})个",count); + }); + } + } diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiAccessLogMapper.xml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiAccessLogMapper.xml new file mode 100644 index 000000000..ae7694d56 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiAccessLogMapper.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper"> + + <!-- + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ + --> + + <delete id="jobCleanAccessLog" parameterType="integer"> + DELETE FROM infra_api_access_log + WHERE id IN ( + SELECT * FROM ( + SELECT id FROM infra_api_access_log + WHERE create_time < DATE_SUB(CURDATE(), INTERVAL #{accessLogJobDay} DAY) + ORDER BY id ASC LIMIT 100 + ) AS a + ) + </delete> + + <select id="optimizeTable"> + ALTER TABLE infra_job_log FORCE + /* + ALTER TABLE infra_job_log ENGINE = INNODB, + ALGORITHM = INPLACE, + LOCK = NONE + */ + </select> + +</mapper> diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiErrorLogMapper.xml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiErrorLogMapper.xml new file mode 100644 index 000000000..842b45ee5 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiErrorLogMapper.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper"> + + <!-- + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ + --> + + <delete id="jobCleanErrorLog" parameterType="integer"> + DELETE FROM infra_api_error_log + WHERE id IN ( + SELECT * FROM ( + SELECT id FROM infra_api_error_log + WHERE create_time < DATE_SUB(CURDATE(), INTERVAL #{errorLogJobDay} DAY) + ORDER BY id ASC LIMIT 100 + ) AS a + ) + </delete> + + <select id="optimizeTable"> + ALTER TABLE infra_api_error_log FORCE + /* + ALTER TABLE infra_api_error_log ENGINE = INNODB, + ALGORITHM = INPLACE, + LOCK = NONE + */ + </select> + +</mapper> diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/JobLogMapper.xml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/JobLogMapper.xml new file mode 100644 index 000000000..e8d9d5ab8 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/JobLogMapper.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper"> + + <!-- + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ + --> + + <delete id="timingJobCleanLog" parameterType="integer"> + DELETE FROM infra_job_log + WHERE id IN ( + SELECT * FROM ( + SELECT id FROM infra_job_log + WHERE create_time < DATE_SUB(CURDATE(), INTERVAL #{jobCleanRetainDay} DAY) + ORDER BY id ASC LIMIT 100 + ) AS a + ) + </delete> + + <select id="optimizeTable"> + ALTER TABLE infra_job_log FORCE + /* + ALTER TABLE infra_job_log ENGINE = INNODB, + ALGORITHM = INPLACE, + LOCK = NONE + */ + </select> + +</mapper> diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 2908a4166..4f7d1a18a 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -213,6 +213,10 @@ yudao: error-code: # 错误码相关配置项 enable: false demo: false # 关闭演示模式 + clean-job: + access-retain-day: 7 + error-retain-day: 8 + job-clean-retain-day: 8 justauth: enabled: true