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