Skip to content

Commit 4f335e9

Browse files
feat: 增加无日志配置并统一日志路径 (#158)
* feat: 增加无日志配置并统一日志路径 * fix: 使用 MAA 核心日志监测运行活动 * fix: MAA 日志路径对齐 AUTO-MAS * docs: 精简无日志说明 * test: 合并无日志重复覆盖 * 添加默认超时 * chore: 更新 runner 至已合并提交
1 parent faff495 commit 4f335e9

29 files changed

Lines changed: 594 additions & 157 deletions

‎AGENTS.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ OneDragon-Helper 项目指南。细节与澄清见各子文档。
2222

2323
> 日常和周常分别声明于 `config/daily_task_list.yml`、`config/weekly_task_list.yml`,统一使用 `display_name / physical_name` 和递归 `options`;原神/终末地反读脚本本地资源(原神三日常:秘境读 tp.json(另含 BGI 内置的「自动选择 → 根据提升指南选择秘境」,值即该文案本身)、地脉花读 AutoLeyLineOutcrop 的地区键、首领讨伐的 boss 名单为静态表需手工跟版),鸣潮/异环通过 GitHub Action 同步选项。日常落点与读写收敛在 `Daily` 机制类(`python-backend/src/config/daily.py`,文件 I/O 由 Daily 自持、直调 utils_sub_config),日常在声明里用 `class` 标注机制类(`DAILY_CLASSES` 注册表查表)并用 `config`/`routine` 标注文件路径、`enable_key`/`enable_task` 标注开关落点(无声明即无「不启用」)、名字只来自声明;周常落点与读写收敛在 `Weekly` 类(`python-backend/src/config/weekly.py`,**一条周常一个对象**、config I/O 自持,声明每条标 `class`/`config`,机制类查 `WEEKLY_CLASSES`;日常和周常由 `ScriptConfig.__init__` 分别调用 `build_dailies` / `build_weeklies` 装配,统一持有并分发调用(`_dailies` / `_weeklies`),`weekly.py` 不持独立对象缓存;周几起是条目级(`0` = 不启用),界面入口只在任务卡(周常行的「周几起」chip,单脚本配置弹窗已无此项));GUI 菜单由声明物化(`daily_config.get_daily_map`),加日常只改 yml;异环两个日常各一段、开关独立。脚本原生任务的开关(纯开/关、无副本落点)另立声明 `config/task_switch_list.yml`(给出该脚本的原生配置文件与任务定义/启用两个键),由 `python-backend/src/config/task_switch.py` 枚举行并按任务名反查 id 写回,界面入口是单脚本配置弹窗底部的「任务」区;与日常/周常互不掺和(行名取脚本配置里的任务名,脚本侧改名或增删任务自动跟上)。日志解析/失败重跑/邮件汇总之运行后动作内联于 `python-backend/src/log` 与 `service`(由 `schedule_run` 统一编排,详见 `python-backend/src/service/README.md`);初始化由 `config_workflow()` 在 `config.yml` 缺失时模板生成。
2424

25-
脚本级资源位置统一声明于 `config/script_resources.yml`(备份范围、游戏路径配置及键路径、背景图、日志目录、链接);`python-backend/src/config/script_resources.py` 只读并校验,机制仍归各 Python 类。用户安装路径不写入此声明,格式与路径基准见 `python-backend/src/config/script_resources.md`。
25+
脚本级资源位置统一声明于 `config/script_resources.yml`(备份范围、游戏路径配置及键路径、背景图、链接);`python-backend/src/config/script_resources.py` 只读并校验,机制仍归各 Python 类。日志文件位置统一放在 `config/log_analysis.yml` 各脚本声明的 `log_path`(实时日志)及可选 `log_analysis_path`(分析使用的不同文件),生成运行链时注入 runner 的 `log_path`;规则见 `python-backend/src/log/README.md`。用户安装路径不写入此声明,格式与路径基准见 `python-backend/src/config/script_resources.md`。
2626

2727
已接入任务的附带业务选项及原神一条龙完成后操作声明于 `config/task_switch_list.yml` 的 `options`,机制类 `TaskOptions` 自持子配置读写;支持开关、单选、多选,不含基础设置或 MAA。两套 GUI 的单脚本配置弹窗通过 `ScriptEdit.task_options` 只提交改动,写盘经 service。格式见 `python-backend/src/config/task_options.md`。
2828

‎TESTING.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ ruff format .
136136

137137
## 4. 调试
138138

139-
先看日志再下结论:主程序日志在 logs/onedragon_helper.log,每日 00:00 轮转,保留 14 天。运行器子进程有独立日志系统 .log/。子脚本日志目录见 config/script_resources.yml 的 logs 声明。日志汇总:uv run --directory python-backend python -m src.log。
139+
先看日志再下结论:主程序日志在 logs/onedragon_helper.log,每日 00:00 轮转,保留 14 天。运行器子进程有独立日志系统 .log/。子脚本日志位置见 config/log_analysis.yml 的 log_path / log_analysis_path 声明。日志汇总:uv run --directory python-backend python -m src.log。
140140

141141
## 5. Windows 全链路真实模拟(手动)
142142

‎config/config.example.yml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ script_list:
1515
notify_done: false
1616
notify_log_interval: 0
1717
attach_direction: ''
18-
no_log_timeout_seconds: 0
19-
no_log_max_retries: 3
18+
no_log_timeout_seconds: 300
19+
no_log_max_retries: 2
2020
block: true
2121
game_path: 'C:\Program Files\Wuthering Waves\Wuthering Waves Game\Wuthering Waves.exe'
2222
game_arguments: '-krqlv=hd'
@@ -57,8 +57,8 @@ script_list:
5757
notify_done: false
5858
notify_log_interval: 0
5959
attach_direction: ''
60-
no_log_timeout_seconds: 0
61-
no_log_max_retries: 3
60+
no_log_timeout_seconds: 300
61+
no_log_max_retries: 1
6262
block: true
6363
- display_name: 绝区零
6464
game_label: ''
@@ -117,8 +117,8 @@ script_list:
117117
notify_done: false
118118
notify_log_interval: 0
119119
attach_direction: ''
120-
no_log_timeout_seconds: 0
121-
no_log_max_retries: 3
120+
no_log_timeout_seconds: 300
121+
no_log_max_retries: 2
122122
block: true
123123
- display_name: 明日方舟
124124
game_label: ''

‎config/log_analysis.yml‎

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1-
# 各游戏脚本运行日志的「关键词匹配」配置,由 src/log/monitor.py 读取。
1+
# 各脚本日志位置与分析规则;运行链生成、日志分析和 GUI 日志跳转共用。
22
#
33
# 原先 hardcode 在 monitor.py 各 *LogParser 子类里的判定关键词(报错标记 / 良性噪声 /
4-
# 每日完成标记 / 终止横幅标记(崩铁专用) / 体力提取正则 / 日志文件名 / 成功与失败判定词)统一集中
4+
# 每日完成标记 / 终止横幅标记(崩铁专用) / 体力提取正则 / 成功与失败判定词)统一集中
55
# 于此,便于在不改代码的情况下调整判定口径。新增游戏时:在下面 parsers 下加一个
66
# 以脚本唯一标识(与 config.yml script_path 推导的 get_script_name 一致)为键的条目即可。
77
#
8+
# log_path:实时日志,相对脚本目录;支持绝对路径、%TEMP%/ 及文件名通配符。
9+
# log_analysis_path:分析文件另有位置时填写;省略则沿用 log_path。
10+
# 未声明或空字符串表示不使用文件日志。只有路径的条目不代表已有成败解析器。
11+
#
812
# 约定:
9-
# - 各字段均为子串(substring)匹配,非正则(stamina_pattern 除外,它是正则)。
13+
# - 分析关键词均为子串(substring)匹配,非正则(stamina_pattern 除外,它是正则)。
1014
# - 命中任一即成立(any)。error_noise 命中则该行不计入报错。
1115
# - success_markers / fail_markers 仅用于 parse_content 的成败判定(见各 Parser 逻辑)。
1216
# - exit_markers 仅崩铁(March7th-Launcher)消费:作「游戏终止」横幅、截断其后的良性收尾报错;
@@ -15,7 +19,7 @@
1519

1620
parsers:
1721
ok-ww:
18-
log_pattern: 'ok-script.log'
22+
log_path: 'data/apps/ok-ww/working/logs/ok-script.log'
1923
# 鸣潮体力:TacetTask 反复记「info_set current_stamina <N>」(分隔符空格/冒号均可),
2024
# 运行结束前以「current stamina: <N> not enough to continue」记真实剩余(无 info_set 前缀、
2125
# 用空格而非下划线)。`(?:info_set )?current[_ ]stamina` 同捕获两种格式,使末次匹配=结束剩余。
@@ -37,7 +41,7 @@ parsers:
3741
- 'Task completed'
3842

3943
ok-nte:
40-
log_pattern: 'ok-script.log'
44+
log_path: 'data/apps/ok-nte/working/logs/ok-script.log'
4145
stamina_pattern: 'info_set 当前体力 (\d+)'
4246
error_markers:
4347
- 'ERROR'
@@ -51,7 +55,8 @@ parsers:
5155
- 'Task completed'
5256

5357
ok-ef:
54-
log_pattern: '日常任务_*.txt'
58+
log_path: 'data/apps/ok-ef/working/logs/ok-script.log'
59+
log_analysis_path: '%TEMP%/ok-ef/日常任务/日常任务_*.txt'
5560
# 终末地「每日做完」=『成功任务』栏含 ⭐日常奖励(OkEfLogParser.parse_daily 限定在该栏内判定)。
5661
# 整体执行状态(部分失败/异常结束)不代表日常没做;且 ⭐日常奖励 也可能出现在失败任务栏,
5762
# 故不可直接用整体状态或全文匹配。此 marker 为栏内判定的关键词,由覆写消费。
@@ -61,7 +66,7 @@ parsers:
6166
- '执行状态: 完成'
6267

6368
March7th-Launcher:
64-
log_pattern: '*.log'
69+
log_path: 'logs/*.log'
6570
# March7th 在「停止运行」统一总结块里同时打「开拓力: X/300」(与开局同格式)和显式
6671
# 「开拓力剩余X/300」(无分隔符、仅结尾出现一次)。`(?:剩余|[::\s]+)?` 兼容带/不带
6772
# 「剩余」标记,使末次匹配优先命中显式剩余行;空格/全角冒号/半角冒号分隔均兼容。
@@ -76,7 +81,7 @@ parsers:
7681
- '停止运行'
7782

7883
OneDragon-Launcher:
79-
log_pattern: 'log.txt'
84+
log_path: '.log/log.txt'
8085
stamina_pattern: '剩余电量 (\d+) 储蓄电量 (\d+) 以太电池 (\d+)'
8186
error_markers:
8287
- '[ERROR]'
@@ -89,7 +94,7 @@ parsers:
8994
- '指令[ 执行应用组 one_dragon ] 执行成功'
9095

9196
BetterGI:
92-
log_pattern: 'better-genshin-impact*.log'
97+
log_path: 'log/better-genshin-impact*.log'
9398
stamina_pattern: '原粹树脂:(\d+),浓缩树脂:(\d+)'
9499
error_markers:
95100
- '[ERR]'
@@ -101,3 +106,11 @@ parsers:
101106
- '一条龙和配置组任务结束'
102107
fail_markers:
103108
- '未领取'
109+
110+
MAA:
111+
# 正常作战期间也可能长时间不更新,无日志阈值由用户设置。
112+
log_path: 'debug/gui.log'
113+
114+
MaaEnd:
115+
# MaaFramework 的实时执行日志,位于 MaaEnd.exe 同级 debug 目录。
116+
log_path: 'debug/maafw.log'

‎config/script_resources.yml‎

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 内置脚本资源声明,随程序发布;不保存用户机器上的安装路径。
22
# 相对路径用 /;game、background、backup_paths 相对脚本目录。
3-
# logs.root 只支持 script / temp;异环 launcher 的向上查找机制仍由适配器实现。
3+
# 日志位置在 log_analysis.yml 声明;异环 launcher 的向上查找机制仍由适配器实现。
44
version: 1
55
scripts:
66
ok-ww:
@@ -10,9 +10,6 @@ scripts:
1010
config: data/apps/ok-ww/working/configs/devices.json
1111
keys:
1212
- pc_full_path
13-
logs:
14-
root: script
15-
path: data/apps/ok-ww/working/logs
1613
links:
1714
homepage: https://mc.kurogames.com/
1815
bilibili: https://space.bilibili.com/1955897084
@@ -25,9 +22,6 @@ scripts:
2522
keys:
2623
- genshinStartConfig
2724
- installPath
28-
logs:
29-
root: script
30-
path: log
3125
links:
3226
homepage: https://ys.mihoyo.com/
3327
bilibili: https://space.bilibili.com/401742377
@@ -39,9 +33,6 @@ scripts:
3933
config: data/apps/ok-ef/working/configs/devices.json
4034
keys:
4135
- pc_full_path
42-
logs:
43-
root: temp
44-
path: ok-ef/日常任务
4536
links:
4637
homepage: https://endfield.hypergryph.com/
4738
bilibili: https://space.bilibili.com/1265652806
@@ -54,9 +45,6 @@ scripts:
5445
keys:
5546
- game_path
5647
background: assets/ui/static_background.webp
57-
logs:
58-
root: script
59-
path: .log
6048
links:
6149
homepage: https://zzz.mihoyo.com/
6250
bilibili: https://space.bilibili.com/1636034895
@@ -69,9 +57,6 @@ scripts:
6957
keys:
7058
- game_path
7159
background: assets/app/images/bg37.jpg
72-
logs:
73-
root: script
74-
path: logs
7560
links:
7661
homepage: https://sr.mihoyo.com/
7762
bilibili: https://space.bilibili.com/1340190821
@@ -84,9 +69,6 @@ scripts:
8469
keys:
8570
- pc_full_path
8671
launcher: NTELauncher.exe
87-
logs:
88-
root: script
89-
path: data/apps/ok-nte/working/logs
9072
links:
9173
homepage: https://yh.wanmei.com/
9274
bilibili: https://space.bilibili.com/3546636978489848

‎docs/rust-feasibility/headless-cli.md‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,12 @@ start_day 为 `0`(不启用)、`1…7`,或 null(未设置),三者不
134134
例如无副本选择的周常选择为空操作;设置未知周常起始日仍保存助手侧意图,跳过游戏侧同步。
135135

136136
`script.edit_save` 的 config_patch 必须包含 script_path、script_type、script_arguments、
137-
check_done、game_process_name、game_path 六个文本字段,以及 kill_script_after_done、
138-
kill_game_after_done、block 三个布尔字段。weekly_timeouts 恰为七项 0~86400 整数或 null;
137+
check_done、game_process_name、game_path、game_arguments 七个文本字段,以及 kill_script_after_done、
138+
kill_game_after_done、block 三个布尔字段,no_log_timeout_seconds、no_log_max_retries 两个
139+
0~2147483647 的整数字段(不接受布尔)。无日志超时单位为秒,0 关闭;重试次数 0 表示不重试。
140+
仅阻塞运行的 external 脚本启用无日志检测;控制台输出或实时日志文件变化任一有活动就刷新计时。
141+
固定日志位置在 `config/log_analysis.yml` 声明,生成链时注入 runner 的 `log_path`。
142+
weekly_timeouts 恰为七项 0~86400 整数或 null;
139143
null 沿用默认超时,低于 10 秒的值保留原运行语义。switches 为任务名到布尔的映射。
140144
表单预校验失败返回 -32602,不写盘。
141145
CLI 将参数构造成 `ScriptEdit` 后调用 `AppService.update_script`,再将返回标识包装为 `{"script_name": "..."}`。

‎python-backend/src/config/script_resources.md‎

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# 脚本资源声明
22

33
`config/script_resources.yml` 保存随助手发布的脚本资源位置。`script_resources.py`
4-
只负责读取、校验和缓存 YAML 字典;配置适配器、日志解析器与链接查询共用这份声明。
4+
只负责读取、校验和缓存 YAML 字典;配置适配器与链接查询共用这份声明。
55
它不导入 GUI,也不实例化 `ScriptConfig`,可供 Python CLI 和后续 Rust 实现使用。
66

77
## 声明边界
88

9-
- 脚本级资源:备份范围、游戏路径所在配置及键路径、默认背景图、日志目录、官网/B 站/GitHub 链接。
9+
- 脚本级资源:备份范围、游戏路径所在配置及键路径、默认背景图、官网/B 站/GitHub 链接。
1010
- 日常、周常和任务开关的文件路径继续由各自的 `daily_task_list.yml`、`weekly_task_list.yml`、`task_switch_list.yml` 持有,不另建一层路径别名。
1111
- 用户机器上的安装路径仍保存在用户配置或脚本原生配置中;手填 `game_path` 仍优先。
1212
- 文件读写、模板合并、游戏启动器搜索、日志解析规则仍由 Python 机制类实现。YAML 不包含可执行表达式。
@@ -24,9 +24,6 @@ scripts:
2424
game:
2525
config: data/apps/ok-ef/working/configs/devices.json
2626
keys: [pc_full_path]
27-
logs:
28-
root: temp
29-
path: ok-ef/日常任务
3027
links:
3128
homepage: https://endfield.hypergryph.com/
3229
bilibili: https://space.bilibili.com/1265652806
@@ -39,7 +36,6 @@ scripts:
3936
| `game.config` / `game.keys` | 相对脚本根目录的配置文件,以及逐层读取游戏路径的键列表 | 省略整个 `game` 表示不反读游戏路径;声明时两项均必填 |
4037
| `game.launcher` | 启动器相对路径;异环机制用它逐层向上查找 | 通用读取不需要;异环机制要求声明 |
4138
| `background` | 相对脚本根目录的默认背景图 | 无脚本默认图,沿用界面回退规则 |
42-
| `logs.root` / `logs.path` | 根目录 `script`(脚本所在目录)或 `temp`(系统临时目录),加相对目录 | 无日志位置声明;有解析器的脚本必须声明 |
4339
| `links` | 完整的 `homepage`、`bilibili`、`github` HTTP(S) URL | 三项均必填 |
4440

4541
路径统一用 `/` 分隔,不允许绝对路径、盘符、`..`、空段或变量插值。
@@ -53,7 +49,7 @@ scripts:
5349
字典保留 YAML 的列表和可选字段形状,不注入缺省字段;消费端处理未声明项。
5450
已注册的 `ScriptConfig` 必须有声明,注册时即校验并绑定 `resources`。
5551
`get_game_exe_path`、`iter_backup_paths`、`get_background_rel_path`、`get_game_link`
56-
和日志模块的公开接口保持不变;`ScriptConfig` 的构造与初始化时机也保持不变。
52+
的公开接口保持不变;`ScriptConfig` 的构造与初始化时机也保持不变。
5753

5854
修改已支持脚本的目录布局或链接,只改声明并验证对应行为;新增脚本仍需注册适配器,
5955
有特殊机制或日志格式时再添加对应 Python 实现。声明不能凭空提供新机制。
@@ -64,3 +60,5 @@ scripts:
6460
路径通过 `get_root_dir()` 定位,打包后从 EXE 同级的 `config/` 读取。
6561
发布工具自动收集 Git 跟踪的 `config/` 文件,更新器按程序资源替换此文件;
6662
因此新增声明必须提交到 Git。发布文件缺失或损坏时直接报错,不回退到 Python 硬编码。
63+
64+
日志位置统一在 `config/log_analysis.yml` 声明,见 [日志配置](../log/README.md)。

‎python-backend/src/config/script_resources.py‎

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from functools import lru_cache
44
from pathlib import Path, PureWindowsPath
5-
from typing import Literal, NotRequired, TypedDict, cast
5+
from typing import NotRequired, TypedDict, cast
66
from urllib.parse import urlsplit
77

88
from src.utils import get_root_dir
@@ -15,17 +15,11 @@ class GamePath(TypedDict):
1515
launcher: NotRequired[str]
1616

1717

18-
class LogPath(TypedDict):
19-
root: Literal["script", "temp"]
20-
path: str
21-
22-
2318
class ScriptResources(TypedDict):
2419
backup_paths: list[str]
2520
links: dict[str, str]
2621
game: NotRequired[GamePath]
2722
background: NotRequired[str]
28-
logs: NotRequired[LogPath]
2923

3024

3125
def _fields(value, required: set[str], optional: set[str], context: str) -> None:
@@ -67,7 +61,7 @@ def _validate_script(value: dict, name: str) -> None:
6761
_fields(
6862
value,
6963
{"backup_paths", "links"},
70-
{"game", "background", "logs"},
64+
{"game", "background"},
7165
name,
7266
)
7367
assert "backup_paths" in value and "links" in value
@@ -89,14 +83,6 @@ def _validate_script(value: dict, name: str) -> None:
8983
_text(key, f"{name}/game/keys")
9084
if "launcher" in node:
9185
_relative_path(node["launcher"], f"{name}/game/launcher")
92-
if "logs" in value:
93-
node = value["logs"]
94-
_fields(node, {"root", "path"}, set(), f"{name}/logs")
95-
assert "root" in node and "path" in node
96-
assert isinstance(node["root"], str) and node["root"] in {"script", "temp"}, (
97-
f"{name}/logs/root 只支持 script / temp"
98-
)
99-
_relative_path(node["path"], f"{name}/logs/path")
10086
if "background" in value:
10187
_relative_path(value["background"], f"{name}/background")
10288
links = value["links"]

0 commit comments

Comments
 (0)