feat(push_log/log_box): 新增通用配置的日志采集推送功能,新增供专项适配器调用的日志采集推送组件,落地OKWW的日志推送功能 - #399
Conversation
1. 新增日志元数据前缀剥离功能,过滤OneDragon风格日志前缀 2. 修改推送日志聚合格式,改为按行展示而非管道符分隔 3. 调整通知模板的日志分隔标识与空行排版
1. 重构推送日志配置,拆分开关与匹配规则 2. 新增表达式解析模块,支持正则提取与函数处理 3. 新增日志模式调试API与前端文档 4. 新增字符串切割、正则、多行聚合等日志处理的说明文档 5. 取消了原本的简易日志处理代码
1. 更新所有文档、注释与前端提示中的分隔符说明,将|替换为; 2. 修正subby函数默认参数与文档描述不一致问题 3. 为字面量添加\n、\t转义支持 4. 统一行预处理逻辑,在apply_patterns入口添加strip()处理行尾空白
1. 重构推送日志数据模型:从list[str]改为list[tuple[str, str]],存储(日志类型, 格式化文本) 2. 增强进程搜索能力:新增进程创建时间过滤,避免跟踪旧残留进程 3. 扩展cutby、subby表达式函数:支持指定匹配序号,处理多分隔符场景 4. 新增日志类型标记:支持普通/失败分类,配合推送策略过滤 5. 补充了一些缺失的依赖
- schema: 新增 PushLogPattern 强类型模型(Literalt split/regex/multiline),PatternDebugIn.pattern 由 Dict 改为强类型 - api: debug_pattern 改用 model_dump(exclude_none) 适配强类型 - frontend: 移除裸 fetch,改用生成的 ActionService.debugPattern 强类型方法,并补齐对应 OpenAPI 生成产物 - version: v5.4.0-beta.7 登记推送日志采集功能
- 用 reactive 包裹调试实例,使弹窗模板中的嵌套 ref 自动解包, 消除 $setup.debug.input.trim is not a function,修复调试界面打不开 - 将 props.pattern 同步到弹窗实例的 currentPattern, 修复点击「调试」无响应(runDebug 因 currentPattern 为空直接返回) - 切换规则时仅清空结果与错误、保留已加载的日志输入, 避免误删用户粘贴/加载的日志内容
- 移除误提交的 .codex/skills gitlink,避免干净克隆缺乏 .gitmodules 无法初始化 - 调试请求复用 @api 生成的 PatternDebugIn/PushLogPattern 契约,消除本地重复类型定义 - debug_pattern 编译忽略 enabled 开关,停用的有效规则也可调试 - flush_patterns 一次收集并返回所有 matcher 残留结果,修复多条 multiline 规则结束时只推首条 - PushLogConfig 调试"加载日志"的 logPath 改传 getter,修复异步加载脚本后误判未配置路径 - GeneralScriptEdit handleChange 串行合并排队保存,不再静默丢弃变更 - 修正普通/失败规则提示文案,对齐实际过滤逻辑(普通始终纳入,失败仅在存在未完成用户时)
逐条修复评审反馈: - 日志轮转/截断后同步重置采集游标,避免恢复后前段推送日志被跳过丢失 - 每次任务重试前重置多行匹配器窗口状态,防止跨重试把不同尝试的日志拼成一个窗口 - 前端序列化必填字段与后端编译条件对齐,缺少必填字段时给出提示,不再静默失效 - 模拟器/游戏切换、根路径选择等保存入口共用串行保存并排空待处理变更,避免刷新覆盖编辑且队列残留 - 非法提取正则由原先的“无匹配”改为抛出具体语法错误,保存/调试接口返回可读报错
表达式引擎被动化,可注入自定义文本变换算子,对 web 前端面板不暴露。 - functions.py 新增 Process 基类(name + run(text, args))、REGISTRY 注入注册表、 @register_process 装饰器、make_process 按表达式调用参数实例化 - evaluator.py 编译期函数名校验放宽为「内置 FUNCTIONS ∪ 注入 REGISTRY」, apply_function 对 Process 子类用 make_process 实例化调用 - rule.py 的 _call 校验同步放开到 REGISTRY 引擎其它能力($() 作用域、函数链、多行聚合字面量)复用现有语义,仅增加注入算子。
log_box 只对日志本身负责:接收「日志源 + 规则 + 处理器」,内部完成采集 → 前置处理(open)→ 规则匹配/提取 → 后置处理(close)→ 结果推送,与专项解耦。 - app/log_box/ 新增:LogBox 工厂(get_collect)、LogCollect 采集器 (open/collect/collect_scope/rule/postprocess/print/push/close)、Rule 可编程 构建器(regex/cut/get/sub/cutby/subby/replace/trim/upper/lower/func)、LogType、 LogSource 多文件自采集(offset 增量读、轮转处理)、@@Logbox@@ 结果标记渲染与解析 - mas_script.py 仓库根顶层别名:from mas_script import log_box, Rule, LogType - 结果落点两态:MAS 进程宿主注入 sink 直接写 push_log;脚本子进程宿主走 @@Logbox@@ 标记回传,由 general/AutoProxy.py 的 check_log 逐行嗅探接收 - .agents/skills 补充 logbox-api.md 使用文档并在 SKILL.md 登记落点 配套验收:MAS 宿主注入 sink 直接进 push_log;脚本宿主经 @@Logbox@@ 出现在任务报告; 前置/后置处理器、print、push 均生效。
gettext PO 解析 + 通用翻译器,供专项/脚本做日志预翻译,不绑定具体脚本 (okww 等只是使用方)。 - po.py:PO 状态机解析(跨行 msgid/msgstr、转义序列、复数取 msgstr[0]、 忽略 msgctxt/文件头/空 msgstr) - translator.py:PoTranslator.load(多文件, base 相对路径动态解析)、 load_supplement(补充优先)、translate(逐行)、clear(会话结束释放) 用法:okww 以 ok.po + 项目自带补充 .po 作前置翻译,补充优先。
open() 文档声明「可选、幂等」,但 LogSource.read_new() 在未 open 时返回空, 导致不显式调用 open() 直接 close() 采不到任何内容。重构 _open_sources(): open() 与 _capture()(close 收尾)共用,close 时自动启动日志源记录起始位置, open 真正可选。 logbox-api.md 修正: - Rule 示例 get(1) 是按字符数保留、不是正则分组提取;改为 regex(r"(\d+)") 捕获组提取,并补充「$() 必须用捕获组、无捕获组返回空串」的说明 - 自定义处理说明:不能用 .process(fn) 直接传 Python 闭包(跨进程只传规则参数、 契约不含函数体),统一用 @register_process 具名注入 + Rule.func() 调用 - 示例补充 col.open() 与 start_from_end 采集语义说明
- collect.py:匹配正则非法时 fail-fast(与表达式编译语义一致),空正则仍按 「不生效」跳过;collect_scope 的起始/结束正则同样校验 - sources.py:LogSource 轮转检测改用文件身份 (st_ino, st_ctime_ns),兼容 Windows 下 st_ino 不可靠(st_ctime 为创建时间,文件被替换时变化) - general/AutoProxy.py:移除从未被读取的 _marker_flushed 死状态;flush 标记 仅表示回传通道结束、不记录状态(结果统一在 final_task 写回 push_log)
MAS 侧尚未把用户脚本进程 stdout 接入 check_log(脚本 stdout 现为 DEVNULL 丢弃、check_log 只读 LogPath 日志文件),也未设置 MAS_SCRIPT_LOG_PATH 与 import mas_script 所需的 PYTHONPATH。文档标注: - 脚本宿主(@@Logbox@@ 回传)为能力预留,当前唯一可用宿主为 MAS 进程注入 sink - 脚本宿主示例标记为将来接通后的用法示意,当前不可交付
OK-WW 专项作为 log_box 的一个实例:只提供参数(日志路径/规则/处理器)并注入 sink,日志获取、前置处理、规则匹配、后置解析与推送全部由 log_box 完成。 - push_log.py:OKWW_REL_I18N_PO(相对 RootPath)/ OKWW_SUPPLEMENT_PO(res/i18n 补充 .po)、OKWW_PUSH_RULES 状态标记规则(开始/失败/跳过/成功四类,失败匹配 源码 log_error 专属日志、排除战斗噪音)、okww_resolve 后处理(按节点解析 最终状态,失败 > 跳过 > 成功) - AutoProxy.py:构造 log_collect,注入 sink 到 cur_user_item.push_log,open 挂 PoTranslator(ok.po + 补充 .po),final_task 调 close(okww_resolve) 收尾 - manager.py:聚合各用户 push_log 进任务报告("失败"类型仅在未完成用户时纳入) - notify.py:通知详情追加 push_log(与 HTML 模板 push_log 区块一致) - res/i18n/okww.po:AutoMAS 项目自带补充翻译(覆盖 ok.po 子串污染、翻译关键 节点日志) 真实日志验证节点完整有序、状态正确;节点级失败始终展示(LogType.NORMAL + 文本状态),推送时机由 SendTaskResultTime 全局控制(与 MAS 原生语义一致)。
- logbox-api.md:新增「日志类型与推送时机语义」章节(LogType 逐条 + SendTaskResultTime 全局,与 MAS 原生一致);专项喂参示例更新为后处理状态解析 - log-box-rework.md:第 3 步描述对齐最终实现(补充 .po、okww_resolve 状态解析、 匹配/提取均在翻译后行、推送时机语义) - version.json:v5.4.0-beta.9 登记 log_box 采集推送能力
将各模块重复的推送日志处理逻辑抽离到app/tools/push_log.py,统一实现push_log的聚合与文本追加,替换原有分散的硬编码实现,更新文档说明通用工具使用方式
- LogCollect.open() 有参调用返回自身,与 close/collect 链式风格统一 - _PostProcessor 直接消费/返回 (log_type, text) 元组,文本改写后日志类型不再丢失 - okww_resolve 按节点名(去状态前缀)重建日志类型映射,修复带状态前缀规则类型错配 - 同步 logbox-api 后处理示例签名,并补充与通用脚本 web 配置推送日志的分工说明
新增目录导航、命名约定说明以及7条常见开发陷阱细节,同时修复resolve函数注释与逻辑细节,优化日志类型匹配逻辑
更新日志匹配规则,新增带前缀的匹配串避免误判普通每日任务异常,同时保留原英文匹配串适配多语言场景
There was a problem hiding this comment.
Sorry @AthenaHibou, your pull request is larger than the review limit of 150000 diff characters
审阅者指南实现了一个可复用的 log_box 日志采集/推送组件、一个可配置的日志模式抽取引擎(含表达式语言),并将推送日志采集集成到通用脚本和 OK-WW 适配器中,同时提供后端 API、前端配置/调试 UI 以及文档。 通用脚本日志处理与 push_log 聚合的时序图sequenceDiagram
participant LM as LogMonitor
participant AP as AutoProxyTask
participant LP as LogPatternExtractor
participant UI as UserItem
participant PT as push_log_tools
participant GM as GeneralManager
participant NO as Notify
LM->>AP: check_log(log_content, latest_time)
AP->>AP: parse_marker(line)
alt script_marker
AP->>AP: push_log_buffer.append((type, text))
else no_marker
AP->>LP: apply_patterns(line, matchers)
alt matched
LP-->>AP: (log_type, text)
AP->>AP: push_log_buffer.append((log_type, formatted_text))
end
end
AP->>AP: _push_log_processed = len(log_content)
AP->>LP: flush_patterns(matchers)
LP-->>AP: [(log_type, text)]
AP->>AP: push_log_buffer.append(...)
AP->>UI: set push_log = push_log_buffer
GM->>PT: build_push_log_text(user_list, has_uncompleted)
PT-->>GM: push_log_text
GM->>NO: push_plyer(..., message["push_log"])
NO-->>NO: append_push_log(message_text, push_log)
log_box 日志采集与推送投递的流程图flowchart TD
A["MAS_or_script_host"] --> B["log_box.get_collect(paths, sink, start_from_end)"]
B --> C["LogCollect"]
C --> D["LogCollect.open(preprocessor)"]
C --> E["LogCollect.collect / collect_scope / rule"]
D --> F["LogSource.read_new"]
F --> G["RegexMatcher / MultiLineAggregator.apply"]
G --> H["LogCollect.close(postprocessor)"]
H --> I{sink_injected?}
I -->|yes| J["sink(log_type, text) → cur_user_item.push_log"]
I -->|no| K["emit(render_push / render_flush)"]
K --> L["AutoProxyTask.check_log"]
L --> M["parse_marker → push_log_buffer"]
subgraph MAS_push_aggregation
N["build_push_log_text(user_list, has_uncompleted)"] --> O["append_push_log(message_text, push_log)"]
end
文件级变更
提示与命令与 Sourcery 交互
自定义你的体验访问你的 控制面板 以:
获取帮助Original review guide in EnglishReviewer's GuideImplements a reusable log_box logging collection/push component, a configurable log pattern extraction engine (including expression language), and integrates push-log collection into both general scripts and the OK-WW adapter with backend APIs, frontend configuration/debug UI, and documentation. Sequence diagram for general script log processing and push_log aggregationsequenceDiagram
participant LM as LogMonitor
participant AP as AutoProxyTask
participant LP as LogPatternExtractor
participant UI as UserItem
participant PT as push_log_tools
participant GM as GeneralManager
participant NO as Notify
LM->>AP: check_log(log_content, latest_time)
AP->>AP: parse_marker(line)
alt script_marker
AP->>AP: push_log_buffer.append((type, text))
else no_marker
AP->>LP: apply_patterns(line, matchers)
alt matched
LP-->>AP: (log_type, text)
AP->>AP: push_log_buffer.append((log_type, formatted_text))
end
end
AP->>AP: _push_log_processed = len(log_content)
AP->>LP: flush_patterns(matchers)
LP-->>AP: [(log_type, text)]
AP->>AP: push_log_buffer.append(...)
AP->>UI: set push_log = push_log_buffer
GM->>PT: build_push_log_text(user_list, has_uncompleted)
PT-->>GM: push_log_text
GM->>NO: push_plyer(..., message["push_log"])
NO-->>NO: append_push_log(message_text, push_log)
Flow diagram for log_box log collection and push deliveryflowchart TD
A["MAS_or_script_host"] --> B["log_box.get_collect(paths, sink, start_from_end)"]
B --> C["LogCollect"]
C --> D["LogCollect.open(preprocessor)"]
C --> E["LogCollect.collect / collect_scope / rule"]
D --> F["LogSource.read_new"]
F --> G["RegexMatcher / MultiLineAggregator.apply"]
G --> H["LogCollect.close(postprocessor)"]
H --> I{sink_injected?}
I -->|yes| J["sink(log_type, text) → cur_user_item.push_log"]
I -->|no| K["emit(render_push / render_flush)"]
K --> L["AutoProxyTask.check_log"]
L --> M["parse_marker → push_log_buffer"]
subgraph MAS_push_aggregation
N["build_push_log_text(user_list, has_uncompleted)"] --> O["append_push_log(message_text, push_log)"]
end
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
# Conflicts: # app/utils/__init__.py # frontend/src/views/EditView/Script/GeneralScriptEdit.vue
代码审查:PR #399(push_log / log_box)审查范围: 整体设计方向是对的:把采集能力从专项抽成 一、需要修复1.
而 对比 PR 里 建议二选一:要么 2. if log_type != "失败" or has_uncompleted
3. 改动后要走到 受影响场景:未配置
另外 90 秒是硬编码魔数,且从 4. for key in sorted(self._map, key=len, reverse=True):
5. with suppress(Exception):
self.log_collect.close(okww_resolve)
self.log_translator.clear()这里会吞掉 二、可以删掉的部分这块按「先问需不需要存在」的标准过一遍,以下代码当前零调用方: 6.
7.
这些是给「将来的专项适配器」预留的 API,但 8. 实际被用到的只有 其中 9.
三、小问题
审查方式:worktree 检出 PR head 后读全文,非仅读 diff。第一、三条已通过调用点 grep 与对照 |
- log_box 日志源支持轮转 .bak 补偿,避免会话中日志轮转导致前段节点信息丢失 - 通用脚本恢复「进程退出即视为任务完成」的判定,避免未配置成功日志且快速结束的脚本被误判为提前退出;90s 宽限期提为命名常量 - push_log 聚合过滤改用 LOG_TYPE_ERROR 常量,避免硬编码失效 - PoTranslator 缓存按长度排序的键列表,避免逐行翻译重复排序整表 - OK-WW 采集收尾异常记录日志,补充翻译路径改为运行时解析 - 删除无调用方接口:LogSource 时间过滤、Rule 编程式构建器与 print/push、serialize_patterns、冗余的 utils 懒加载导出与 okww last_type 重映射 - 修正 schema 推送模式描述、evaluator 未用变量等小问题
1. 新增OkwwUserConfig_Notify的PushLogEnabled配置项与前端编辑控件 2. 在AutoProxy中根据开关控制log_box的创建与销毁,省采集开销 3. 更新版本日志与开发文档说明该开关的使用模式 4. 调整日志聚合相关注释说明现有逻辑适配新开关
…to pr-399 # Conflicts: # .agents/skills/mas-script-specialized-adapter/SKILL.md # res/version.json
feat:
一、push_log:新增推送配置,允许用户通过字符串切割/正则/函数进行日志处理,从而自定义推送运行进程执行情况
详见pr #386
二、log_box:将日志采集推送能力从具体专项抽离为通用的 log_box 组件,使专项与可编辑脚本只需"喂参数(日志位置 + 规则 + 处理器)",采集、前置处理、规则匹配、后置处理、推送统一由组件完成,最终汇入 cur_user_item.push_log 单一 sink。
提供Skill文档,位于.agents\skills\mas-script-specialized-adapter\references\logbox-api.md
详见pr #392
Summary by Sourcery
统一可配置与专用的日志采集,使任务报告可以通过共享的推送日志(push-log)管线包含处理后的执行详情。
New Features:
log_box组件,用于专用适配器和脚本宿主集成,支持规则构建器、处理管线、日志接收端(sinks)以及日志标记(log marker)。Bug Fixes:
Enhancements:
Documentation:
log_box使用文档,并新增前端参考指南,涵盖分割、正则、表达式和多行日志处理。Chores:
Original summary in English
Summary by Sourcery
Unify configurable and specialized log collection so task reports can include processed execution details through a shared push-log pipeline.
New Features:
Bug Fixes:
Enhancements:
Documentation:
Chores: