问题
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 近乎常态。
建议
任一即可:
- 在
LogMonitor 每轮循环里按当前时间重算路径,而不是构造时算死;
- 或同时探测「构造日」与「构造日 +1 天」两个文件,检测到旧文件停止增长且新文件出现时切换。
方案 2 更稳,因为 M9A 的滚动时刻与 MAS 的判定时刻之间必然有一小段窗口。
顺带一提,app/utils/LogMonitor.py:104-105 的 file_mtime_date == date.today() 门禁也是本地日期口径,不过它只在监控启动时判定一次且带 latch,跨午夜不受影响,这里不算问题。
环境
- 上游
dev @ 9e6b0d0a(2026-08-30)
- 本地时区 UTC+2
问题
M9A 的日志文件路径在任务实例化时就用当时的本地日期算定,之后不再更新:
而
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。
这是全时区通病,但发作概率与用户所处时区强相关:
建议
任一即可:
LogMonitor每轮循环里按当前时间重算路径,而不是构造时算死;方案 2 更稳,因为 M9A 的滚动时刻与 MAS 的判定时刻之间必然有一小段窗口。
顺带一提,
app/utils/LogMonitor.py:104-105的file_mtime_date == date.today()门禁也是本地日期口径,不过它只在监控启动时判定一次且带 latch,跨午夜不受影响,这里不算问题。环境
dev@9e6b0d0a(2026-08-30)