Files
game_server/docs/logging_optimization_summary.md
zyh 53d6de47dc refactor: 优化设备状态检查服务和定时任务日志输出
主要修改:
1. 将设备状态检查服务中的INFO级别日志调整为DEBUG级别,以减少日志冗余。
2. 更新定时检查空闲设备的日志输出,简化信息并保持DEBUG级别。
3. 仅在发现需要更新的任务时输出INFO级别日志,提升日志的可读性和有效性。

技术细节:
- 通过调整日志级别,增强了系统的调试能力,同时保持了必要的信息输出。
2025-08-27 16:04:57 +08:00

6.2 KiB
Raw Blame History

日志优化总结

🎯 优化目标

减少不必要的日志输出,只在有实际数据库更新操作时才输出重要信息,避免日志过于冗余。

📝 优化前的问题

当设备空闲但没有需要更新的链接任务时系统仍会输出大量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 日志
  • 移除了冗余的开始/结束标记

优化前:

log.info("设备ID: {}, 检查原因: {}", machineId, reason);
log.info("设备状态解析结果: {}", statusInfo);
log.info("设备 {} 处于空闲状态,检查相关链接任务", machineId);
log.info("设备 {} 没有处于LOGGED_IN状态的链接任务", machineId);
log.info("=== 设备状态检查完成 ===");

优化后:

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
  • 简化了开始/结束日志

优化前:

log.debug("=== 开始定时检查空闲设备 ===");
log.info("发现 {} 个空闲设备: {}", availableDevices.size(), availableDevices);
log.debug("=== 定时检查空闲设备完成 ===");

优化后:

log.debug("开始定时检查空闲设备");
log.debug("发现 {} 个空闲设备: {}", availableDevices.size(), availableDevices);
log.debug("定时检查空闲设备完成");

2. 保留的重要日志

以下日志仍然保持 INFO 或更高级别,确保重要操作可追踪:

  • 数据库更新操作: 当真正更新链接任务状态时
  • 异常情况: 获取设备状态失败、更新失败等
  • 关键业务操作: 链接任务完成标记
// 重要操作日志 - 保持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

🔧 配置建议

生产环境日志级别配置

# 应用整体日志级别
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

开发环境调试配置

# 开发环境可以开启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操作

现在系统在正常运行时会保持相对安静,只有在真正进行游戏完成检测和状态更新时才会输出关键信息!🚀