2.7 KiB
2.7 KiB
修复说明 - 2026年1月22日
修复的问题
1. 日志重复输出问题
现象:每条日志都会输出两次
原因:logging.basicConfig() 配置会在模块每次被导入时重复添加处理器,导致日志重复输出。
解决方案:
- 使用
if not logger.handlers:检查,确保处理器只被添加一次 - 设置
logger.propagate = False防止日志传播到根记录器 - 使用显式的logger配置替代
basicConfig
2. 连续异常时自动重新登录
现象:当连续多次出现解析失败、获取页面失败或网络错误时,程序不会尝试重新登录,导致持续失败。
解决方案: 在以下场景达到3次连续失败时,自动触发重新登录:
-
获取成绩页面失败
- 连续3次失败 → 尝试重新登录
- 登录成功 → 重置错误计数,继续监控
- 登录失败 → 继续累积错误计数
-
网络错误(页面过短)
- 连续3次网络错误 → 尝试重新登录
- 登录成功 → 重置错误计数
- 登录失败 → 继续累积错误计数
-
解析课程失败(0门课程)
- 连续3次解析失败 → 尝试重新登录
- 登录成功 → 重置错误计数
- 登录失败 → 发送通知,可能需要人工介入
技术细节
日志配置改进
# 旧代码
logging.basicConfig(...)
logger = logging.getLogger(__name__)
# 新代码
logger = logging.getLogger(__name__)
if not logger.handlers:
# 配置处理器
logger.propagate = False
重新登录逻辑
if consecutive_errors >= 3:
logger.warning("⚠️ 尝试重新登录以解决问题...")
if self.login():
logger.info("✓ 重新登录成功,重置错误计数")
consecutive_errors = 0
continue
else:
logger.error("✗ 重新登录失败")
使用建议
-
重启服务:修改后需要重启服务使改动生效
sudo systemctl restart grade-monitor -
查看日志:确认日志不再重复
sudo journalctl -u grade-monitor -f # 或 tail -f monitor.log -
监控效果:
- 日志应该只输出一次
- 连续3次异常会自动尝试重新登录
- 重新登录成功后会显示 "✓ 重新登录成功"
预期效果
- ✅ 日志不再重复输出
- ✅ 连续3次异常自动重新登录
- ✅ 重新登录成功后重置错误计数
- ✅ 减少因登录会话过期导致的持续失败
- ✅ 更好的容错性和自愈能力
注意事项
- 重新登录会记录在日志中,便于追踪
- 如果重新登录失败,仍会继续累积错误计数
- 达到5次最大连续错误后会发送邮件通知