Commit 00c2153fd306169b4962c0a0ddc04ea208cfab91

Authored by 芋道源码
Committed by Gitee
2 parents 3875c804 11921fab

!646 ApiAccessLog、ApiErrorLog、JobLog 3 个日志的 定时 物理清理

Merge pull request !646 from lanxindx/feature/mall_product
Showing 29 changed files with 391 additions and 0 deletions
yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/config/YudaoQuartzAutoConfiguration.java
1 package cn.iocoder.yudao.framework.quartz.config; 1 package cn.iocoder.yudao.framework.quartz.config;
2 2
  3 +import cn.iocoder.yudao.framework.quartz.core.job.JobLogJobHandler;
  4 +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties;
3 import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager; 5 import cn.iocoder.yudao.framework.quartz.core.scheduler.SchedulerManager;
4 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
5 import org.quartz.Scheduler; 7 import org.quartz.Scheduler;
6 import org.springframework.boot.autoconfigure.AutoConfiguration; 8 import org.springframework.boot.autoconfigure.AutoConfiguration;
  9 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
7 import org.springframework.context.annotation.Bean; 10 import org.springframework.context.annotation.Bean;
8 import org.springframework.scheduling.annotation.EnableScheduling; 11 import org.springframework.scheduling.annotation.EnableScheduling;
9 12
@@ -15,6 +18,7 @@ import java.util.Optional; @@ -15,6 +18,7 @@ import java.util.Optional;
15 @AutoConfiguration 18 @AutoConfiguration
16 @EnableScheduling // 开启 Spring 自带的定时任务 19 @EnableScheduling // 开启 Spring 自带的定时任务
17 @Slf4j 20 @Slf4j
  21 +@EnableConfigurationProperties(LogJobProperties.class)
18 public class YudaoQuartzAutoConfiguration { 22 public class YudaoQuartzAutoConfiguration {
19 23
20 @Bean 24 @Bean
@@ -26,4 +30,9 @@ public class YudaoQuartzAutoConfiguration { @@ -26,4 +30,9 @@ public class YudaoQuartzAutoConfiguration {
26 return new SchedulerManager(scheduler.get()); 30 return new SchedulerManager(scheduler.get());
27 } 31 }
28 32
  33 + @Bean
  34 + public JobLogJobHandler jobLogJobHandler(LogJobProperties logJobProperties){
  35 + return new JobLogJobHandler(logJobProperties);
  36 + }
  37 +
29 } 38 }
yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/JobLogJobHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.quartz.core.job;
  2 +
  3 +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
  4 +import cn.iocoder.yudao.framework.quartz.core.service.JobLogFrameworkService;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +
  8 +import javax.annotation.Resource;
  9 +
  10 +/**
  11 + * @Author: j-sentinel
  12 + * @Date: 2023/9/30 20:40
  13 + */
  14 +@Slf4j
  15 +@AllArgsConstructor
  16 +public class JobLogJobHandler implements JobHandler {
  17 +
  18 + private LogJobProperties logJobProperties;
  19 +
  20 + public JobLogJobHandler(LogJobProperties logJobProperties) {
  21 + this.logJobProperties = logJobProperties;
  22 + }
  23 +
  24 + @Resource
  25 + private JobLogFrameworkService jobLogFrameworkService;
  26 +
  27 + @Override
  28 + public String execute(String param) throws Exception {
  29 + Integer integer = jobLogFrameworkService.timingJobCleanLog(logJobProperties.getJobCleanRetainDay());
  30 + log.info("定时执行清理定时任务日志数量({})个",integer);
  31 + return String.format("定时执行清理定时任务日志数量 %s 个", integer);
  32 + }
  33 +}
yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/job/LogJobProperties.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.quartz.core.job;
  2 +
  3 +import lombok.Data;
  4 +import org.springframework.boot.context.properties.ConfigurationProperties;
  5 +
  6 +/**
  7 + * @Author: j-sentinel
  8 + * @Date: 2023/9/30 16:17
  9 + */
  10 +@Data
  11 +@ConfigurationProperties(prefix = "yudao.clean-job")
  12 +public class LogJobProperties {
  13 +
  14 + private int accessRetainDay = 7;
  15 +
  16 + private int errorRetainDay = 8;
  17 +
  18 + private int jobCleanRetainDay = 7;
  19 +
  20 +}
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 { @@ -41,4 +41,10 @@ public interface JobLogFrameworkService {
41 @NotNull(message = "运行时长不能为空") Integer duration, 41 @NotNull(message = "运行时长不能为空") Integer duration,
42 boolean success, String result); 42 boolean success, String result);
43 43
  44 + /**
  45 + * 清理 @param jobCleanRetainDay 天的访问日志
  46 + *
  47 + * @param jobCleanRetainDay 超过多少天就进行清理
  48 + */
  49 + Integer timingJobCleanLog(Integer jobCleanRetainDay);
44 } 50 }
yudao-framework/yudao-spring-boot-starter-web/pom.xml
@@ -61,6 +61,12 @@ @@ -61,6 +61,12 @@
61 <artifactId>jsoup</artifactId> 61 <artifactId>jsoup</artifactId>
62 </dependency> 62 </dependency>
63 63
  64 + <!-- Job 定时任务相关 -->
  65 + <dependency>
  66 + <groupId>cn.iocoder.boot</groupId>
  67 + <artifactId>yudao-spring-boot-starter-job</artifactId>
  68 + </dependency>
  69 +
64 </dependencies> 70 </dependencies>
65 71
66 </project> 72 </project>
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java
1 package cn.iocoder.yudao.framework.apilog.config; 1 package cn.iocoder.yudao.framework.apilog.config;
2 2
3 import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter; 3 import cn.iocoder.yudao.framework.apilog.core.filter.ApiAccessLogFilter;
  4 +import cn.iocoder.yudao.framework.apilog.core.job.ApiAccessLogJobHandler;
  5 +import cn.iocoder.yudao.framework.apilog.core.job.ApiErrorLogJobHandler;
4 import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService; 6 import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
5 import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl; 7 import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl;
6 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; 8 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
7 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl; 9 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl;
8 import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; 10 import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
  11 +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties;
9 import cn.iocoder.yudao.framework.web.config.WebProperties; 12 import cn.iocoder.yudao.framework.web.config.WebProperties;
10 import cn.iocoder.yudao.framework.web.config.YudaoWebAutoConfiguration; 13 import cn.iocoder.yudao.framework.web.config.YudaoWebAutoConfiguration;
11 import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi; 14 import cn.iocoder.yudao.module.infra.api.logger.ApiAccessLogApi;
@@ -31,6 +34,16 @@ public class YudaoApiLogAutoConfiguration { @@ -31,6 +34,16 @@ public class YudaoApiLogAutoConfiguration {
31 return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi); 34 return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi);
32 } 35 }
33 36
  37 + @Bean
  38 + public ApiAccessLogJobHandler apiAccessLogJobHandler(LogJobProperties logJobProperties) {
  39 + return new ApiAccessLogJobHandler(logJobProperties);
  40 + }
  41 +
  42 + @Bean
  43 + public ApiErrorLogJobHandler apiErrorLogJobHandler(LogJobProperties logJobProperties) {
  44 + return new ApiErrorLogJobHandler(logJobProperties);
  45 + }
  46 +
34 /** 47 /**
35 * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 48 * 创建 ApiAccessLogFilter Bean,记录 API 请求日志
36 */ 49 */
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiAccessLogJobHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.apilog.core.job;
  2 +
  3 +import cn.iocoder.yudao.framework.apilog.core.service.ApiAccessLogFrameworkService;
  4 +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
  5 +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties;
  6 +import lombok.AllArgsConstructor;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +
  9 +import javax.annotation.Resource;
  10 +
  11 +/**
  12 + * @Author: j-sentinel
  13 + * @Date: 2023/9/30 16:13
  14 + */
  15 +@Slf4j
  16 +@AllArgsConstructor
  17 +public class ApiAccessLogJobHandler implements JobHandler {
  18 +
  19 + private LogJobProperties logJobProperties;
  20 +
  21 + public ApiAccessLogJobHandler(LogJobProperties logJobProperties) {
  22 + this.logJobProperties = logJobProperties;
  23 + }
  24 +
  25 + @Resource
  26 + private ApiAccessLogFrameworkService apiAccessLogFrameworkService;
  27 +
  28 + @Override
  29 + public String execute(String param) throws Exception {
  30 + apiAccessLogFrameworkService.jobCleanAccessLog(logJobProperties.getAccessRetainDay());
  31 + return "";
  32 + }
  33 +
  34 +}
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/job/ApiErrorLogJobHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.apilog.core.job;
  2 +
  3 +import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
  4 +import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
  5 +import cn.iocoder.yudao.framework.quartz.core.job.LogJobProperties;
  6 +import lombok.AllArgsConstructor;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +
  9 +import javax.annotation.Resource;
  10 +
  11 +/**
  12 + * @Author: j-sentinel
  13 + * @Date: 2023/9/30 16:13
  14 + */
  15 +@Slf4j
  16 +@AllArgsConstructor
  17 +public class ApiErrorLogJobHandler implements JobHandler {
  18 +
  19 + private LogJobProperties logJobProperties;
  20 +
  21 + public ApiErrorLogJobHandler(LogJobProperties logJobProperties) {
  22 + this.logJobProperties = logJobProperties;
  23 + }
  24 +
  25 + @Resource
  26 + private ApiErrorLogFrameworkService apiErrorLogFrameworkService;
  27 +
  28 + @Override
  29 + public String execute(String param) throws Exception {
  30 + apiErrorLogFrameworkService.jobCleanErrorLog(logJobProperties.getErrorRetainDay());
  31 + return "";
  32 + }
  33 +
  34 +}
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 { @@ -14,4 +14,10 @@ public interface ApiAccessLogFrameworkService {
14 */ 14 */
15 void createApiAccessLog(ApiAccessLog apiAccessLog); 15 void createApiAccessLog(ApiAccessLog apiAccessLog);
16 16
  17 + /**
  18 + * 清理 @param accessLogJobDay 天的访问日志
  19 + *
  20 + * @param accessLogJobDay 超过多少天就进行清理
  21 + */
  22 + void jobCleanAccessLog(Integer accessLogJobDay);
17 } 23 }
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 @@ -25,4 +25,9 @@ public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkSe
25 apiAccessLogApi.createApiAccessLog(reqDTO); 25 apiAccessLogApi.createApiAccessLog(reqDTO);
26 } 26 }
27 27
  28 + @Override
  29 + public void jobCleanAccessLog(Integer accessLogJobDay) {
  30 + apiAccessLogApi.jobCleanAccessLog(accessLogJobDay);
  31 + }
  32 +
28 } 33 }
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 { @@ -14,4 +14,10 @@ public interface ApiErrorLogFrameworkService {
14 */ 14 */
15 void createApiErrorLog(ApiErrorLog apiErrorLog); 15 void createApiErrorLog(ApiErrorLog apiErrorLog);
16 16
  17 + /**
  18 + * 清理 @param errorLogJobDay 天的访问日志
  19 + *
  20 + * @param errorLogJobDay 超过多少天就进行清理
  21 + */
  22 + void jobCleanErrorLog(Integer errorLogJobDay);
17 } 23 }
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 @@ -25,4 +25,9 @@ public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkServ
25 apiErrorLogApi.createApiErrorLog(reqDTO); 25 apiErrorLogApi.createApiErrorLog(reqDTO);
26 } 26 }
27 27
  28 + @Override
  29 + public void jobCleanErrorLog(Integer errorLogJobDay) {
  30 + apiErrorLogApi.jobCleanErrorLog(errorLogJobDay);
  31 + }
  32 +
28 } 33 }
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 { @@ -18,4 +18,10 @@ public interface ApiAccessLogApi {
18 */ 18 */
19 void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO); 19 void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO);
20 20
  21 + /**
  22 + * 清理 @param accessLogJobDay 天的访问日志
  23 + *
  24 + * @param accessLogJobDay 超过多少天就进行清理
  25 + */
  26 + void jobCleanAccessLog(Integer accessLogJobDay);
21 } 27 }
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 { @@ -18,4 +18,10 @@ public interface ApiErrorLogApi {
18 */ 18 */
19 void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO); 19 void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO);
20 20
  21 + /**
  22 + * 清理 @param errorLogJobDay 天的访问日志
  23 + *
  24 + * @param errorLogJobDay 超过多少天就进行清理
  25 + */
  26 + void jobCleanErrorLog(Integer errorLogJobDay);
21 } 27 }
yudao-module-infra/yudao-module-infra-biz/pom.xml
@@ -35,6 +35,10 @@ @@ -35,6 +35,10 @@
35 <groupId>cn.iocoder.boot</groupId> 35 <groupId>cn.iocoder.boot</groupId>
36 <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> 36 <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
37 </dependency> 37 </dependency>
  38 + <dependency>
  39 + <groupId>cn.iocoder.boot</groupId>
  40 + <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
  41 + </dependency>
38 42
39 <!-- Web 相关 --> 43 <!-- Web 相关 -->
40 <dependency> 44 <dependency>
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 { @@ -24,4 +24,9 @@ public class ApiAccessLogApiImpl implements ApiAccessLogApi {
24 apiAccessLogService.createApiAccessLog(createDTO); 24 apiAccessLogService.createApiAccessLog(createDTO);
25 } 25 }
26 26
  27 + @Override
  28 + public void jobCleanAccessLog(Integer accessLogJobDay) {
  29 + apiAccessLogService.jobCleanAccessLog(accessLogJobDay);
  30 + }
  31 +
27 } 32 }
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 { @@ -24,4 +24,9 @@ public class ApiErrorLogApiImpl implements ApiErrorLogApi {
24 apiErrorLogService.createApiErrorLog(createDTO); 24 apiErrorLogService.createApiErrorLog(createDTO);
25 } 25 }
26 26
  27 + @Override
  28 + public void jobCleanErrorLog(Integer errorLogJobDay) {
  29 + apiErrorLogService.jobCleanErrorLog(errorLogJobDay);
  30 + }
  31 +
27 } 32 }
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 @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReq
7 import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; 7 import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO; 8 import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO;
9 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
  10 +import org.apache.ibatis.annotations.Param;
10 11
11 import java.util.List; 12 import java.util.List;
12 13
@@ -40,4 +41,7 @@ public interface JobLogMapper extends BaseMapperX&lt;JobLogDO&gt; { @@ -40,4 +41,7 @@ public interface JobLogMapper extends BaseMapperX&lt;JobLogDO&gt; {
40 ); 41 );
41 } 42 }
42 43
  44 + Integer timingJobCleanLog(@Param("jobCleanRetainDay") Integer jobCleanRetainDay);
  45 +
  46 + void optimizeTable();
43 } 47 }
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 @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.Api
7 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; 7 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; 8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO;
9 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
  10 +import org.apache.ibatis.annotations.Param;
10 11
11 import java.util.List; 12 import java.util.List;
12 13
@@ -44,4 +45,7 @@ public interface ApiAccessLogMapper extends BaseMapperX&lt;ApiAccessLogDO&gt; { @@ -44,4 +45,7 @@ public interface ApiAccessLogMapper extends BaseMapperX&lt;ApiAccessLogDO&gt; {
44 ); 45 );
45 } 46 }
46 47
  48 + Integer jobCleanAccessLog(@Param("accessLogJobDay") Integer accessLogJobDay);
  49 +
  50 + void optimizeTable();
47 } 51 }
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 @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiE
7 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; 7 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; 8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO;
9 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
  10 +import org.apache.ibatis.annotations.Param;
10 11
11 import java.util.List; 12 import java.util.List;
12 13
@@ -42,4 +43,7 @@ public interface ApiErrorLogMapper extends BaseMapperX&lt;ApiErrorLogDO&gt; { @@ -42,4 +43,7 @@ public interface ApiErrorLogMapper extends BaseMapperX&lt;ApiErrorLogDO&gt; {
42 ); 43 );
43 } 44 }
44 45
  46 + Integer jobCleanErrorLog(@Param("errorLogJobDay") Integer errorLogJobDay);
  47 +
  48 + void optimizeTable();
45 } 49 }
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; @@ -26,6 +26,8 @@ import java.util.List;
26 @Slf4j 26 @Slf4j
27 public class JobLogServiceImpl implements JobLogService { 27 public class JobLogServiceImpl implements JobLogService {
28 28
  29 + private static final Integer DELETE_LIMIT = 1;
  30 +
29 @Resource 31 @Resource
30 private JobLogMapper jobLogMapper; 32 private JobLogMapper jobLogMapper;
31 33
@@ -51,6 +53,22 @@ public class JobLogServiceImpl implements JobLogService { @@ -51,6 +53,22 @@ public class JobLogServiceImpl implements JobLogService {
51 } 53 }
52 54
53 @Override 55 @Override
  56 + public Integer timingJobCleanLog(Integer jobCleanRetainDay) {
  57 + Integer result = null;
  58 + int count = 0;
  59 + while (result == null || DELETE_LIMIT.equals(result)){
  60 + result = jobLogMapper.timingJobCleanLog(jobCleanRetainDay);
  61 + count += result;
  62 + }
  63 + if(count > 0){
  64 + // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。
  65 + // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。
  66 + jobLogMapper.optimizeTable();
  67 + }
  68 + return count;
  69 + }
  70 +
  71 + @Override
54 public JobLogDO getJobLog(Long id) { 72 public JobLogDO getJobLog(Long id) {
55 return jobLogMapper.selectById(id); 73 return jobLogMapper.selectById(id);
56 } 74 }
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 { @@ -38,4 +38,10 @@ public interface ApiAccessLogService {
38 */ 38 */
39 List<ApiAccessLogDO> getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO); 39 List<ApiAccessLogDO> getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO);
40 40
  41 + /**
  42 + * 清理 @param accessLogJobDay 天的访问日志
  43 + *
  44 + * @param accessLogJobDay 超过多少天就进行清理
  45 + */
  46 + void jobCleanAccessLog(Integer accessLogJobDay);
41 } 47 }
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java
1 package cn.iocoder.yudao.module.infra.service.logger; 1 package cn.iocoder.yudao.module.infra.service.logger;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
4 import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; 5 import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
5 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; 6 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO;
6 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; 7 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
7 import cn.iocoder.yudao.module.infra.convert.logger.ApiAccessLogConvert; 8 import cn.iocoder.yudao.module.infra.convert.logger.ApiAccessLogConvert;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO; 9 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO;
9 import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper; 10 import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper;
  11 +import lombok.extern.slf4j.Slf4j;
10 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
11 import org.springframework.validation.annotation.Validated; 13 import org.springframework.validation.annotation.Validated;
12 14
@@ -18,10 +20,13 @@ import java.util.List; @@ -18,10 +20,13 @@ import java.util.List;
18 * 20 *
19 * @author 芋道源码 21 * @author 芋道源码
20 */ 22 */
  23 +@Slf4j
21 @Service 24 @Service
22 @Validated 25 @Validated
23 public class ApiAccessLogServiceImpl implements ApiAccessLogService { 26 public class ApiAccessLogServiceImpl implements ApiAccessLogService {
24 27
  28 + private static final Integer DELETE_LIMIT = 100;
  29 +
25 @Resource 30 @Resource
26 private ApiAccessLogMapper apiAccessLogMapper; 31 private ApiAccessLogMapper apiAccessLogMapper;
27 32
@@ -41,4 +46,22 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService { @@ -41,4 +46,22 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService {
41 return apiAccessLogMapper.selectList(exportReqVO); 46 return apiAccessLogMapper.selectList(exportReqVO);
42 } 47 }
43 48
  49 + @Override
  50 + public void jobCleanAccessLog(Integer accessLogJobDay) {
  51 + TenantUtils.executeIgnore(() -> {
  52 + Integer result = null;
  53 + int count = 0;
  54 + while (result == null || DELETE_LIMIT.equals(result)) {
  55 + result = apiAccessLogMapper.jobCleanAccessLog(accessLogJobDay);
  56 + count += result;
  57 + }
  58 + if (count > 0) {
  59 + // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。
  60 + // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。
  61 + apiAccessLogMapper.optimizeTable();
  62 + }
  63 + log.info("定时执行清理访问日志数量({})个", count);
  64 + });
  65 + }
  66 +
44 } 67 }
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 { @@ -47,4 +47,10 @@ public interface ApiErrorLogService {
47 */ 47 */
48 void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId); 48 void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId);
49 49
  50 + /**
  51 + * 清理 @param errorLogJobDay 天的访问日志
  52 + *
  53 + * @param errorLogJobDay 超过多少天就进行清理
  54 + */
  55 + void jobCleanErrorLog(Integer errorLogJobDay);
50 } 56 }
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java
1 package cn.iocoder.yudao.module.infra.service.logger; 1 package cn.iocoder.yudao.module.infra.service.logger;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
4 import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; 5 import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
5 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; 6 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO;
6 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; 7 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; @@ -8,6 +9,7 @@ import cn.iocoder.yudao.module.infra.convert.logger.ApiErrorLogConvert;
8 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO; 9 import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO;
9 import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper; 10 import cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper;
10 import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; 11 import cn.iocoder.yudao.module.infra.enums.logger.ApiErrorLogProcessStatusEnum;
  12 +import lombok.extern.slf4j.Slf4j;
11 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
12 import org.springframework.validation.annotation.Validated; 14 import org.springframework.validation.annotation.Validated;
13 15
@@ -24,10 +26,13 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.API_ERROR_L @@ -24,10 +26,13 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.API_ERROR_L
24 * 26 *
25 * @author 芋道源码 27 * @author 芋道源码
26 */ 28 */
  29 +@Slf4j
27 @Service 30 @Service
28 @Validated 31 @Validated
29 public class ApiErrorLogServiceImpl implements ApiErrorLogService { 32 public class ApiErrorLogServiceImpl implements ApiErrorLogService {
30 33
  34 + private static final Integer DELETE_LIMIT = 100;
  35 +
31 @Resource 36 @Resource
32 private ApiErrorLogMapper apiErrorLogMapper; 37 private ApiErrorLogMapper apiErrorLogMapper;
33 38
@@ -62,4 +67,22 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService { @@ -62,4 +67,22 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService {
62 .processUserId(processUserId).processTime(LocalDateTime.now()).build()); 67 .processUserId(processUserId).processTime(LocalDateTime.now()).build());
63 } 68 }
64 69
  70 + @Override
  71 + public void jobCleanErrorLog(Integer errorLogJobDay) {
  72 + TenantUtils.executeIgnore(() -> {
  73 + Integer result = null;
  74 + int count = 0;
  75 + while (result == null || DELETE_LIMIT.equals(result)) {
  76 + result = apiErrorLogMapper.jobCleanErrorLog(errorLogJobDay);
  77 + count += result;
  78 + }
  79 + if (count > 0) {
  80 + // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。
  81 + // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。
  82 + apiErrorLogMapper.optimizeTable();
  83 + }
  84 + log.info("定时执行清理错误日志数量({})个",count);
  85 + });
  86 + }
  87 +
65 } 88 }
yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiAccessLogMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiAccessLogMapper">
  4 +
  5 + <!--
  6 + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
  7 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
  8 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
  9 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
  10 + -->
  11 +
  12 + <delete id="jobCleanAccessLog" parameterType="integer">
  13 + DELETE FROM infra_api_access_log
  14 + WHERE id IN (
  15 + SELECT * FROM (
  16 + SELECT id FROM infra_api_access_log
  17 + WHERE create_time &lt; DATE_SUB(CURDATE(), INTERVAL #{accessLogJobDay} DAY)
  18 + ORDER BY id ASC LIMIT 100
  19 + ) AS a
  20 + )
  21 + </delete>
  22 +
  23 + <select id="optimizeTable">
  24 + ALTER TABLE infra_job_log FORCE
  25 + /*
  26 + ALTER TABLE infra_job_log ENGINE = INNODB,
  27 + ALGORITHM = INPLACE,
  28 + LOCK = NONE
  29 + */
  30 + </select>
  31 +
  32 +</mapper>
yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/ApiErrorLogMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper">
  4 +
  5 + <!--
  6 + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
  7 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
  8 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
  9 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
  10 + -->
  11 +
  12 + <delete id="jobCleanErrorLog" parameterType="integer">
  13 + DELETE FROM infra_api_error_log
  14 + WHERE id IN (
  15 + SELECT * FROM (
  16 + SELECT id FROM infra_api_error_log
  17 + WHERE create_time &lt; DATE_SUB(CURDATE(), INTERVAL #{errorLogJobDay} DAY)
  18 + ORDER BY id ASC LIMIT 100
  19 + ) AS a
  20 + )
  21 + </delete>
  22 +
  23 + <select id="optimizeTable">
  24 + ALTER TABLE infra_api_error_log FORCE
  25 + /*
  26 + ALTER TABLE infra_api_error_log ENGINE = INNODB,
  27 + ALGORITHM = INPLACE,
  28 + LOCK = NONE
  29 + */
  30 + </select>
  31 +
  32 +</mapper>
yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/JobLogMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper">
  4 +
  5 + <!--
  6 + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
  7 + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
  8 + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
  9 + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
  10 + -->
  11 +
  12 + <delete id="timingJobCleanLog" parameterType="integer">
  13 + DELETE FROM infra_job_log
  14 + WHERE id IN (
  15 + SELECT * FROM (
  16 + SELECT id FROM infra_job_log
  17 + WHERE create_time &lt; DATE_SUB(CURDATE(), INTERVAL #{jobCleanRetainDay} DAY)
  18 + ORDER BY id ASC LIMIT 100
  19 + ) AS a
  20 + )
  21 + </delete>
  22 +
  23 + <select id="optimizeTable">
  24 + ALTER TABLE infra_job_log FORCE
  25 + /*
  26 + ALTER TABLE infra_job_log ENGINE = INNODB,
  27 + ALGORITHM = INPLACE,
  28 + LOCK = NONE
  29 + */
  30 + </select>
  31 +
  32 +</mapper>
yudao-server/src/main/resources/application-local.yaml
@@ -213,6 +213,10 @@ yudao: @@ -213,6 +213,10 @@ yudao:
213 error-code: # 错误码相关配置项 213 error-code: # 错误码相关配置项
214 enable: false 214 enable: false
215 demo: false # 关闭演示模式 215 demo: false # 关闭演示模式
  216 + clean-job:
  217 + access-retain-day: 7
  218 + error-retain-day: 8
  219 + job-clean-retain-day: 8
216 220
217 justauth: 221 justauth:
218 enabled: true 222 enabled: true