Skip to content

feat: 保留进程崩溃诊断日志并升级至 2.0.7 - #17

Merged
hawklithm merged 1 commit into
mainfrom
fix/process-diagnostics-2.0.7
Oct 23, 2026
Merged

hawklithm merged 1 commit into
mainfrom
fix/process-diagnostics-2.0.7

Conversation

@hawklithm

Copy link
Copy Markdown
Owner

背景

2026-10-23 凌晨代理最后一条成功请求记录在 02:35:35,直到 07:38 手动启动前没有进一步进程日志;现有业务日志无法区分进程意外退出、终端结束或强制终止,也无法稳定保留 Python/Uvicorn 控制台错误。

本 PR 从当前远端 main(eca6f70)直接创建,只有进程诊断与 2.0.7 版本升级,不改业务协议、转发、认证、签到或模型处理流程。

实现

  1. 保留 stdout/stderr:ProcessDiagnostics 用 Tee 同步显示并保存 Python 层 stdout/stderr(包括 traceback / Uvicorn 错误),写入 console.log,20 MiB × 当前文件 + 4 个历史文件,落盘并按大小轮转;不中断现有控制台输出。Python fatal fault 经 faulthandler 保存到 crash.log。
  2. 生命周期和退出码:新增 process-events.jsonl(2 MiB × 当前文件 + 3 个历史文件),记录 PID、run_id、启动、正常返回、非零返回、SystemExit、KeyboardInterrupt、未捕获致命异常、退出码及运行时长。代理的主入口包裹进程诊断管理器,保留原有成功/失败退出码语义。
  3. 外部信号与非正常终止:委托 Uvicorn 原有信号处理的同时观察 SIGINT/SIGTERM,尽可能记录接收信号;SIGTERM 走可观测退出路径。对 Windows TerminateProcess、SIGKILL、断电等无法运行退出钩子的情况,下次启动记录 previous_run_exit_unobserved(不是已证实崩溃;并行实例也可能出现该事件)。
  4. 异常现场:记录可用的进程内存快照、未处理的 asyncio 后台任务异常、线程异常、unraisable exception。Hook 会继续调用原来的错误处理器;不会吞掉异常。
  5. 日志写入失败:控制台镜像、文件日志处理器及结构化 JSONL 写失败时尽力记录 diagnostic_log_failure,并向原始 stderr 提示;避免诊断功能自身导致代理中断。结构化日志只记录异常类型与关键数值,不写敏感的请求正文。
  6. 版本:pyproject.toml 的包版本与 FastAPI metadata 升级为 2.0.7;中英文 README 补充日志入口,新增 docs/process-diagnostics-2.0.7.md(查看方法、安全说明、可观测性限制)。

范围说明:Tee 捕获 Python sys.stdout/sys.stderr 层输出;直接向操作系统原生文件描述符写入的内容仍需外部终端/进程管理器重定向。日志包含原始错误信息,共享之前必须脱敏。此 PR 不做守护进程或自动重启。

验证

  • test_process_diagnostics.py:22 passed,涵盖正常/异常退出、非零退出码、异常 traceback、SIGTERM、强制杀死子进程并在下次启动观测缺失退出事件、Console Tee 与轮转、日志故障降级、未处理异步/线程异常、主入口接入、2.0.7 版本。
  • 项目回归:254 passed, 1 skipped, 1 deselected(排除的仍是旧有 Windows 上 stat.S_IMODE(...) == 0o600 断言;未修改该测试)。
  • compileall 及 Git whitespace 检查通过。
  • 分支相对 main ahead 1 / behind 0,共 7 个文件;本地没有未提交内容。

未创建 2.0.7 Tag 或 Release,也没有重启正在运行的本地代理。建议代码评审通过后合并,再由维护者完成版本标签和 GitHub Release 流程。

@hawklithm
hawklithm merged commit 83f60e9 into main Oct 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant