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 &lt; 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 &lt; 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 &lt; 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