optimize(log): 优化日志报告与清理逻辑

- 将日志报告线程名称从"logrThread"更正为"logReportThread"
- 使用isEmpty()替代size()>0判断集合是否为空
- 将Integer.valueOf()替换为Integer.parseInt()
- 在日志清理逻辑中增加异常捕获,防止线程因异常退出
- 完善异常日志记录,增加错误堆栈信息
- 保持线程操作一致性,更新stop方法中的线程中断和等待逻辑
3.3.0-release
xuxueli 2 weeks ago
parent e92f3a5e1c
commit 74a6d00158

@ -2656,6 +2656,7 @@ public void execute() {
当前任务审计日志以Info级别输出在系统日志中可通过关键词 "xxl-job operation log:" 检索过滤)
- 19、【优化】调度组件日志完善提升边界情况下问题定位效率
- 20、【升级】升级多项maven依赖至较新版本如 netty、groovy、springboot、spring-ai、dify、mybatis、xxl-sso 等;
- 21、【优化】优日志报告与清理逻辑增加清理过期日志的异常捕获避免线程异常退出
**备注:**
a、本次升级数据模型向前兼容v3.2.*版本可直接升级不需要进行数据库表调整;

@ -17,17 +17,17 @@ import java.util.concurrent.TimeUnit;
* @author xuxueli 2019-11-22
*/
public class JobLogReportHelper {
private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);
private static final Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);
private Thread logrThread;
private Thread logReportThread;
private volatile boolean toStop = false;
/**
* start
*/
public void start(){
logrThread = new Thread(new Runnable() {
logReportThread = new Thread(new Runnable() {
@Override
public void run() {
@ -68,10 +68,10 @@ public class JobLogReportHelper {
xxlJobLogReport.setFailCount(0);
Map<String, Object> triggerCountMap = XxlJobAdminBootstrap.getInstance().getXxlJobLogMapper().findLogReport(todayFrom, todayTo);
if (triggerCountMap!=null && triggerCountMap.size()>0) {
int triggerDayCount = triggerCountMap.containsKey("triggerDayCount")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))):0;
int triggerDayCountRunning = triggerCountMap.containsKey("triggerDayCountRunning")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountRunning"))):0;
int triggerDayCountSuc = triggerCountMap.containsKey("triggerDayCountSuc")?Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountSuc"))):0;
if (triggerCountMap!=null && !triggerCountMap.isEmpty()) {
int triggerDayCount = triggerCountMap.containsKey("triggerDayCount")?Integer.parseInt(String.valueOf(triggerCountMap.get("triggerDayCount"))):0;
int triggerDayCountRunning = triggerCountMap.containsKey("triggerDayCountRunning")?Integer.parseInt(String.valueOf(triggerCountMap.get("triggerDayCountRunning"))):0;
int triggerDayCountSuc = triggerCountMap.containsKey("triggerDayCountSuc")?Integer.parseInt(String.valueOf(triggerCountMap.get("triggerDayCountSuc"))):0;
int triggerDayCountFail = triggerDayCount - triggerDayCountRunning - triggerDayCountSuc;
xxlJobLogReport.setRunningCount(triggerDayCountRunning);
@ -88,34 +88,40 @@ public class JobLogReportHelper {
} catch (Throwable e) {
if (!toStop) {
logger.error(">>>>>>>>>>> xxl-job, job log report thread error:{}", e);
logger.error(">>>>>>>>>>> xxl-job, JobLogReportHelper(log-report refresh) error:{}", e.getMessage(), e);
}
}
// 2、log-clean: switch open & once each day
if (XxlJobAdminBootstrap.getInstance().getLogretentiondays()>0
&& System.currentTimeMillis() - lastCleanLogTime > 24*60*60*1000) {
// expire-time
Calendar expiredDay = Calendar.getInstance();
expiredDay.add(Calendar.DAY_OF_MONTH, -1 * XxlJobAdminBootstrap.getInstance().getLogretentiondays());
expiredDay.set(Calendar.HOUR_OF_DAY, 0);
expiredDay.set(Calendar.MINUTE, 0);
expiredDay.set(Calendar.SECOND, 0);
expiredDay.set(Calendar.MILLISECOND, 0);
Date clearBeforeTime = expiredDay.getTime();
// clean expired log
List<Long> logIds = null;
do {
logIds = XxlJobAdminBootstrap.getInstance().getXxlJobLogMapper().findClearLogIds(0, 0, clearBeforeTime, 0, 1000);
if (logIds!=null && logIds.size()>0) {
XxlJobAdminBootstrap.getInstance().getXxlJobLogMapper().clearLog(logIds);
}
} while (logIds!=null && logIds.size()>0);
// update clean time
lastCleanLogTime = System.currentTimeMillis();
try {
if (XxlJobAdminBootstrap.getInstance().getLogretentiondays()>0
&& System.currentTimeMillis() - lastCleanLogTime > 24*60*60*1000) {
// expire-time
Calendar expiredDay = Calendar.getInstance();
expiredDay.add(Calendar.DAY_OF_MONTH, -1 * XxlJobAdminBootstrap.getInstance().getLogretentiondays());
expiredDay.set(Calendar.HOUR_OF_DAY, 0);
expiredDay.set(Calendar.MINUTE, 0);
expiredDay.set(Calendar.SECOND, 0);
expiredDay.set(Calendar.MILLISECOND, 0);
Date clearBeforeTime = expiredDay.getTime();
// clean expired log
List<Long> logIds = null;
do {
logIds = XxlJobAdminBootstrap.getInstance().getXxlJobLogMapper().findClearLogIds(0, 0, clearBeforeTime, 0, 1000);
if (logIds!=null && !logIds.isEmpty()) {
XxlJobAdminBootstrap.getInstance().getXxlJobLogMapper().clearLog(logIds);
}
} while (logIds!=null && !logIds.isEmpty());
// update clean time
lastCleanLogTime = System.currentTimeMillis();
}
} catch (Exception e) {
if (!toStop) {
logger.error(">>>>>>>>>>> xxl-job, JobLogReportHelper(log-clean) error:{}", e.getMessage(), e);
}
}
try {
@ -132,9 +138,9 @@ public class JobLogReportHelper {
}
});
logrThread.setDaemon(true);
logrThread.setName("xxl-job, admin JobLogReportHelper");
logrThread.start();
logReportThread.setDaemon(true);
logReportThread.setName("xxl-job, admin JobLogReportHelper");
logReportThread.start();
}
/**
@ -143,9 +149,9 @@ public class JobLogReportHelper {
public void stop(){
toStop = true;
// interrupt and wait
logrThread.interrupt();
logReportThread.interrupt();
try {
logrThread.join();
logReportThread.join();
} catch (Throwable e) {
logger.error(e.getMessage(), e);
}

Loading…
Cancel
Save