refactor: 优化设备状态检查服务和定时任务日志输出
主要修改: 1. 将设备状态检查服务中的INFO级别日志调整为DEBUG级别,以减少日志冗余。 2. 更新定时检查空闲设备的日志输出,简化信息并保持DEBUG级别。 3. 仅在发现需要更新的任务时输出INFO级别日志,提升日志的可读性和有效性。 技术细节: - 通过调整日志级别,增强了系统的调试能力,同时保持了必要的信息输出。
This commit is contained in:
158
docs/logging_optimization_summary.md
Normal file
158
docs/logging_optimization_summary.md
Normal file
@@ -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操作
|
||||
|
||||
现在系统在正常运行时会保持相对安静,只有在真正进行游戏完成检测和状态更新时才会输出关键信息!🚀
|
||||
@@ -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<LinkTask> 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) {
|
||||
|
||||
@@ -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("定时检查空闲设备完成");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user