From 53d6de47dc8a709e4a0a9fad5b8e18c119313016 Mon Sep 17 00:00:00 2001 From: zyh Date: Wed, 27 Aug 2025 16:04:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=8A=B6=E6=80=81=E6=A3=80=E6=9F=A5=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=92=8C=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要修改: 1. 将设备状态检查服务中的INFO级别日志调整为DEBUG级别,以减少日志冗余。 2. 更新定时检查空闲设备的日志输出,简化信息并保持DEBUG级别。 3. 仅在发现需要更新的任务时输出INFO级别日志,提升日志的可读性和有效性。 技术细节: - 通过调整日志级别,增强了系统的调试能力,同时保持了必要的信息输出。 --- docs/logging_optimization_summary.md | 158 ++++++++++++++++++ .../device/DeviceStatusCheckService.java | 15 +- .../server/task/DeviceStatusCheckTask.java | 6 +- 3 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 docs/logging_optimization_summary.md diff --git a/docs/logging_optimization_summary.md b/docs/logging_optimization_summary.md new file mode 100644 index 0000000..d21df67 --- /dev/null +++ b/docs/logging_optimization_summary.md @@ -0,0 +1,158 @@ +# 日志优化总结 + +## 🎯 优化目标 + +减少不必要的日志输出,只在有实际数据库更新操作时才输出重要信息,避免日志过于冗余。 + +## 📝 优化前的问题 + +当设备空闲但没有需要更新的链接任务时,系统仍会输出大量INFO级别的日志: + +``` +2025-08-27 15:59:43.427 INFO 27180 --- [ scheduling-1] c.g.s.s.device.DeviceStatusCheckService : 设备ID: gg8, 检查原因: 定时检查 +2025-08-27 15:59:43.481 INFO 27180 --- [ scheduling-1] c.g.s.s.device.DeviceStatusCheckService : 设备状态解析结果: DeviceStatusInfo{status='空闲', points=null, idle=true} +2025-08-27 15:59:43.481 INFO 27180 --- [ scheduling-1] c.g.s.s.device.DeviceStatusCheckService : 设备 gg8 处于空闲状态,检查相关链接任务 +2025-08-27 15:59:43.484 INFO 27180 --- [ scheduling-1] c.g.s.s.device.DeviceStatusCheckService : 设备 gg8 没有处于LOGGED_IN状态的链接任务 +2025-08-27 15:59:43.484 INFO 27180 --- [ scheduling-1] c.g.s.s.device.DeviceStatusCheckService : === 设备状态检查完成 === +``` + +## ✅ 优化后的改进 + +### **1. 日志级别调整** + +#### **DeviceStatusCheckService.java** +- ✅ 将常规检查日志从 `INFO` 调整为 `DEBUG` +- ✅ 只有在找到需要更新的任务时才输出 `INFO` 日志 +- ✅ 移除了冗余的开始/结束标记 + +**优化前**: +```java +log.info("设备ID: {}, 检查原因: {}", machineId, reason); +log.info("设备状态解析结果: {}", statusInfo); +log.info("设备 {} 处于空闲状态,检查相关链接任务", machineId); +log.info("设备 {} 没有处于LOGGED_IN状态的链接任务", machineId); +log.info("=== 设备状态检查完成 ==="); +``` + +**优化后**: +```java +log.debug("检查设备状态: 设备ID={}, 检查原因={}", machineId, reason); +log.debug("设备 {} 状态解析结果: {}", machineId, statusInfo); +log.debug("设备 {} 没有处于LOGGED_IN状态的链接任务,无需更新", machineId); +// 只有找到需要更新的任务时才输出INFO日志 +log.info("设备 {} 处于空闲状态,发现 {} 个LOGGED_IN状态的链接任务,开始更新为完成状态", machineId, loggedInTasks.size()); +``` + +#### **DeviceStatusCheckTask.java** +- ✅ 将定时任务的常规执行日志调整为 `DEBUG` +- ✅ 简化了开始/结束日志 + +**优化前**: +```java +log.debug("=== 开始定时检查空闲设备 ==="); +log.info("发现 {} 个空闲设备: {}", availableDevices.size(), availableDevices); +log.debug("=== 定时检查空闲设备完成 ==="); +``` + +**优化后**: +```java +log.debug("开始定时检查空闲设备"); +log.debug("发现 {} 个空闲设备: {}", availableDevices.size(), availableDevices); +log.debug("定时检查空闲设备完成"); +``` + +### **2. 保留的重要日志** + +以下日志仍然保持 `INFO` 或更高级别,确保重要操作可追踪: + +- ✅ **数据库更新操作**: 当真正更新链接任务状态时 +- ✅ **异常情况**: 获取设备状态失败、更新失败等 +- ✅ **关键业务操作**: 链接任务完成标记 + +```java +// 重要操作日志 - 保持INFO级别 +log.info("设备 {} 处于空闲状态,发现 {} 个LOGGED_IN状态的链接任务,开始更新为完成状态", machineId, loggedInTasks.size()); +log.info("链接任务 {} (代码: {}) 已标记为完成,完成点数: {}", task.getId(), task.getCodeNo(), points); + +// 异常日志 - 保持WARN/ERROR级别 +log.warn("获取设备状态失败,设备ID: {}", machineId); +log.error("检查设备状态时发生异常,设备ID: {}", machineId, e); +``` + +## 📊 优化效果 + +### **场景1: 无需更新时(常见场景)** +**优化前**: 5行INFO日志 + SQL查询日志 +**优化后**: 仅DEBUG日志,生产环境基本无输出 + +### **场景2: 有任务更新时(关键场景)** +**优化前**: 5行INFO日志 + 更新日志 +**优化后**: 2-3行INFO日志,突出重要操作 + +### **日志输出对比** + +#### **优化前(无更新场景)**: +``` +INFO - 设备ID: gg8, 检查原因: 定时检查 +DEBUG - 获取设备状态: 设备=gg8, url=... +DEBUG - 解析设备 gg8 的状态信息 +DEBUG - 设备 gg8 状态解析完成: {...} +DEBUG - 获取设备状态成功: 设备=gg8, 状态={...} +INFO - 设备状态解析结果: DeviceStatusInfo{...} +INFO - 设备 gg8 处于空闲状态,检查相关链接任务 +INFO - 设备 gg8 没有处于LOGGED_IN状态的链接任务 +INFO - === 设备状态检查完成 === +``` + +#### **优化后(无更新场景)**: +``` +DEBUG - 检查设备状态: 设备ID=gg8, 检查原因=定时检查 +DEBUG - 获取设备状态: 设备=gg8, url=... +DEBUG - 解析设备 gg8 的状态信息 +DEBUG - 设备 gg8 状态解析完成: {...} +DEBUG - 获取设备状态成功: 设备=gg8, 状态={...} +DEBUG - 设备 gg8 状态解析结果: DeviceStatusInfo{...} +DEBUG - 设备 gg8 没有处于LOGGED_IN状态的链接任务,无需更新 +``` + +#### **优化后(有更新场景)**: +``` +DEBUG - 检查设备状态: 设备ID=gg8, 检查原因=定时检查 +... (DEBUG日志) ... +INFO - 设备 gg8 处于空闲状态,发现 2 个LOGGED_IN状态的链接任务,开始更新为完成状态 +INFO - 链接任务 123 (代码: ABC001) 已标记为完成,完成点数: 900 +INFO - 链接任务 124 (代码: ABC002) 已标记为完成,完成点数: 900 +``` + +## 🔧 配置建议 + +### **生产环境日志级别配置** +```properties +# 应用整体日志级别 +logging.level.root=INFO + +# 设备检查相关服务 - 只显示重要操作 +logging.level.com.gameplatform.server.service.device=INFO +logging.level.com.gameplatform.server.task=INFO + +# 外部服务调用 - 减少噪音 +logging.level.com.gameplatform.server.service.external=WARN +``` + +### **开发环境调试配置** +```properties +# 开发环境可以开启DEBUG查看详细流程 +logging.level.com.gameplatform.server.service.device=DEBUG +logging.level.com.gameplatform.server.service.external=DEBUG +``` + +## 🎉 总结 + +通过这次优化: + +1. **减少日志噪音**: 常规检查不再产生大量INFO日志 +2. **突出重要操作**: 真正的业务操作(数据库更新)更加醒目 +3. **保持可调试性**: 通过DEBUG级别仍可查看详细执行流程 +4. **提升性能**: 减少不必要的日志I/O操作 + +现在系统在正常运行时会保持相对安静,只有在真正进行游戏完成检测和状态更新时才会输出关键信息!🚀 diff --git a/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java b/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java index 5208181..e33496f 100644 --- a/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java +++ b/src/main/java/com/gameplatform/server/service/device/DeviceStatusCheckService.java @@ -30,8 +30,7 @@ public class DeviceStatusCheckService { */ @Transactional public void checkDeviceStatusAndUpdateTasks(String machineId, String reason) { - log.info("=== 开始检查设备状态 ==="); - log.info("设备ID: {}, 检查原因: {}", machineId, reason); + log.debug("检查设备状态: 设备ID={}, 检查原因={}", machineId, reason); try { // 1. 获取设备状态 @@ -43,21 +42,18 @@ public class DeviceStatusCheckService { // 2. 解析设备状态 DeviceStatusInfo statusInfo = parseDeviceStatus(deviceStatus); - log.info("设备状态解析结果: {}", statusInfo); + log.debug("设备 {} 状态解析结果: {}", machineId, statusInfo); // 3. 如果设备空闲,检查是否有使用该设备的LOGGED_IN状态链接 if (statusInfo.isIdle()) { - log.info("设备 {} 处于空闲状态,检查相关链接任务", machineId); updateCompletedTasks(machineId, statusInfo.getPoints()); } else { - log.info("设备 {} 不是空闲状态: {}", machineId, statusInfo.getStatus()); + log.debug("设备 {} 状态为 [{}],非空闲状态,跳过检查", machineId, statusInfo.getStatus()); } } catch (Exception e) { log.error("检查设备状态时发生异常,设备ID: {}", machineId, e); } - - log.info("=== 设备状态检查完成 ==="); } /** @@ -105,11 +101,12 @@ public class DeviceStatusCheckService { List loggedInTasks = linkTaskMapper.findByMachineIdAndStatus(machineId, "LOGGED_IN"); if (loggedInTasks.isEmpty()) { - log.info("设备 {} 没有处于LOGGED_IN状态的链接任务", machineId); + log.debug("设备 {} 没有处于LOGGED_IN状态的链接任务,无需更新", machineId); return; } - log.info("找到 {} 个使用设备 {} 且状态为LOGGED_IN的链接任务", loggedInTasks.size(), machineId); + // 只有找到需要更新的任务时才输出INFO日志 + log.info("设备 {} 处于空闲状态,发现 {} 个LOGGED_IN状态的链接任务,开始更新为完成状态", machineId, loggedInTasks.size()); // 更新所有相关任务为COMPLETED状态 for (LinkTask task : loggedInTasks) { diff --git a/src/main/java/com/gameplatform/server/task/DeviceStatusCheckTask.java b/src/main/java/com/gameplatform/server/task/DeviceStatusCheckTask.java index 3dc99b5..33ff59b 100644 --- a/src/main/java/com/gameplatform/server/task/DeviceStatusCheckTask.java +++ b/src/main/java/com/gameplatform/server/task/DeviceStatusCheckTask.java @@ -29,7 +29,7 @@ public class DeviceStatusCheckTask { */ @Scheduled(fixedRate = 60000) // 每60秒执行一次 public void checkIdleDevicesAndUpdateTasks() { - log.debug("=== 开始定时检查空闲设备 ==="); + log.debug("开始定时检查空闲设备"); try { // 1. 获取所有设备状态 @@ -46,7 +46,7 @@ public class DeviceStatusCheckTask { return; } - log.info("发现 {} 个空闲设备: {}", availableDevices.size(), availableDevices); + log.debug("发现 {} 个空闲设备: {}", availableDevices.size(), availableDevices); // 2. 对每个空闲设备检查是否有相关的LOGGED_IN状态链接任务 for (String deviceId : availableDevices) { @@ -62,6 +62,6 @@ public class DeviceStatusCheckTask { log.error("定时检查空闲设备时发生异常", e); } - log.debug("=== 定时检查空闲设备完成 ==="); + log.debug("定时检查空闲设备完成"); } }