Skip to content

[Bug] 跨本地午夜时 M9A 日志监控盯错文件,任务被误判超时 #464

Description

@qiyinxi

问题

M9A 的日志文件路径在任务实例化时就用当时的本地日期算定,之后不再更新:

# app/task/M9A/AutoProxy.py:91-92
today_date = datetime.now().strftime("%Y%m%d")
self.m9a_log_path = self.m9a_root_path / f"logs/log-{today_date}.log"

AutoProxyTask逐用户构造的(app/task/M9A/manager.py 的用户循环里,每个用户 new 一次),路径在该用户任务开始的那一刻固定。

日期口径本身没错——M9A 自己也按本地日期滚动日志,两边对得上。缺陷在时机:一旦某个用户的任务跨过本地 00:00,M9A 滚到 log-<新日期>.log,MAS 仍在盯 log-<旧日期>.log,读不到任何新行。

后果

LogMonitor 收不到新日志 → datetime.now() - latest_time 持续增长 → 达到 RunTimeLimit(默认 10 分钟)后判定超时,任务被标记失败并中止,而 M9A 实际可能正常运行到底。

触发条件

单个用户的 M9A 任务跨过本地 00:00。

这是全时区通病,但发作概率与用户所处时区强相关:

  • UTC+8:游戏日在本地 04:00 翻页,「换日后立刻跑」的自然时段是 04:00 以后,是一天中离本地午夜最远的时刻,几乎不会撞上。
  • UTC+2:游戏日在本地 22:00 翻页,自然时段是 22:00 以后,多账号队列跨越本地 00:00 近乎常态。

建议

任一即可:

  1. LogMonitor 每轮循环里按当前时间重算路径,而不是构造时算死;
  2. 或同时探测「构造日」与「构造日 +1 天」两个文件,检测到旧文件停止增长且新文件出现时切换。

方案 2 更稳,因为 M9A 的滚动时刻与 MAS 的判定时刻之间必然有一小段窗口。

顺带一提,app/utils/LogMonitor.py:104-105file_mtime_date == date.today() 门禁也是本地日期口径,不过它只在监控启动时判定一次且带 latch,跨午夜不受影响,这里不算问题。

环境

  • 上游 dev @ 9e6b0d0a(2026-08-30)
  • 本地时区 UTC+2

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions