Files
GPA_Monitoring/修复说明_2026-01-22_重复日志和自动重登录.md
ChuXun d1dc08a16d 1
2026-01-29 03:39:01 +08:00

2.7 KiB
Raw Blame History

修复说明 - 2026年1月22日

修复的问题

1. 日志重复输出问题

现象:每条日志都会输出两次

原因logging.basicConfig() 配置会在模块每次被导入时重复添加处理器,导致日志重复输出。

解决方案

  • 使用 if not logger.handlers: 检查,确保处理器只被添加一次
  • 设置 logger.propagate = False 防止日志传播到根记录器
  • 使用显式的logger配置替代 basicConfig

2. 连续异常时自动重新登录

现象:当连续多次出现解析失败、获取页面失败或网络错误时,程序不会尝试重新登录,导致持续失败。

解决方案 在以下场景达到3次连续失败时自动触发重新登录

  1. 获取成绩页面失败

    • 连续3次失败 → 尝试重新登录
    • 登录成功 → 重置错误计数,继续监控
    • 登录失败 → 继续累积错误计数
  2. 网络错误(页面过短)

    • 连续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("✗ 重新登录失败")

使用建议

  1. 重启服务:修改后需要重启服务使改动生效

    sudo systemctl restart grade-monitor
    
  2. 查看日志:确认日志不再重复

    sudo journalctl -u grade-monitor -f
    # 或
    tail -f monitor.log
    
  3. 监控效果

    • 日志应该只输出一次
    • 连续3次异常会自动尝试重新登录
    • 重新登录成功后会显示 "✓ 重新登录成功"

预期效果

  • 日志不再重复输出
  • 连续3次异常自动重新登录
  • 重新登录成功后重置错误计数
  • 减少因登录会话过期导致的持续失败
  • 更好的容错性和自愈能力

注意事项

  • 重新登录会记录在日志中,便于追踪
  • 如果重新登录失败,仍会继续累积错误计数
  • 达到5次最大连续错误后会发送邮件通知