Skip to content

fix(logging): harness WARNING+ 日志镜像到 stderr,journalctl 可见 - #603

Open
angri450 wants to merge 1 commit into
TencentCloud:developfrom
angri450:fix/harness-log-stderr
Open

fix(logging): harness WARNING+ 日志镜像到 stderr,journalctl 可见#603
angri450 wants to merge 1 commit into
TencentCloud:developfrom
angri450:fix/harness-log-stderr

Conversation

@angri450

@angri450 angri450 commented Sep 7, 2026

Copy link
Copy Markdown

问题

服务端排查模型切换问题时发现:harness 层的诊断日志(如模型路由 failover 的 model failover: ... failed (...), trying next)在 journalctl -u octop 里完全看不到。

根因:_setup_logging 只给 root logger 和 uvicorn 系列 logger 挂了滚动文件 handler,所有日志(含 WARNING+)只落 ~/.octop/logs/*.log,进程 stderr 无输出;journald 捕获不到。排障时终端侧是盲的。

修复

  • 新增 _attach_harness_stderr_handler():给 harness_agent logger 附加 stderr StreamHandler(WARNING 及以上,带 %(levelname)s:%(name)s 格式),覆盖 model failover、tool guard 等全部 harness 诊断日志
  • 幂等:handler 打 _octop_harness_stderr marker 属性,重复 setup 不叠加
  • 文件 handler 照旧收全量日志,stderr 只镜像 WARNING+,与 uvicorn logger「文件 + stderr」双路一致
  • _setup_logging 末尾调用

测试

  • 新增 tests/unit/infra/test_server_logging.py:2 个用例(handler 只挂一次 + level=WARNING;warning 记录确实带 logger 名输出到 stderr),本地 pytest 通过
  • 本机实测:坏 key provider 放模型路由链头触发 failover,journalctl -u octop 实时出现 WARNING:harness_agent.middleware.model_failover: model failover: ... (OpenAIAuthenticationError: 401 ...), trying next

背景

模型路由 failover(按用户配置的链依次切换模型)目前运行在 harness_agent 层,日志经此修复可在服务端直接观测切换行为。

_setup_logging only attached the rotating-file handler to the root and
uvicorn loggers, so harness diagnostics (model failover, tool guard, ...)
landed in ~/.octop/logs/*.log but never reached stderr — invisible to
journalctl -u octop during incident triage.

Attach an idempotent stderr StreamHandler (WARNING+) to the harness_agent
logger; file keeps receiving full logs, stderr mirrors warnings and above,
same dual-path as the uvicorn loggers.
Copilot AI lite review requested due to automatic review settings September 7, 2026 23:09

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

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.

2 participants