Skip to content

Harden logging system and expose structured logging controls #5

@dddleader

Description

@dddleader

Issue Draft: Logging System Hardening and Structured Logging Exposure

Summary

当前日志系统已经具备基础能力,但存在注释与实现不一致、结构化日志能力未真正接入、关键错误未完整落盘、工具崩溃缺少日志记录、以及 logger 使用不统一等问题。
这些问题会影响线上排障、问题回溯、日志分析和后续可观测性建设。

本 issue 目标是统一并补强现有日志系统,在保持“按大小轮转”这一简单稳定策略的前提下,让结构化日志真正可用,并确保关键失败路径稳定写入日志文件。

Background

当前代码中的主要问题点如下:

  1. minicode/logging_config.py 注释声称支持“按大小 + 按时间轮转”,但实际只使用了 RotatingFileHandler
  2. StructuredFormatterlog_api_calllog_tool_executionlog_permission_checklog_session_event 等辅助函数已经存在,但未在主流程中有效接入。
  3. 普通运行入口未暴露结构化日志开关,用户无法通过 CLI 或环境变量启用 JSON 日志。
  4. 一些关键失败场景仅输出到 stderr,未写入日志文件。
  5. ToolRegistry.execute() 会把工具异常包装成 ToolResult 返回,但不会同步写日志,导致某些工具崩溃只能在会话输出中看到,无法在日志文件中检索。
  6. 个别模块未统一使用 minicode.* logger 命名空间,存在日志旁路到 root logger 的风险。

Goals

  1. 明确日志轮转策略,以“按大小轮转”为唯一正式策略,并修正文档/注释。
  2. 打通结构化日志能力,使 API、工具执行、权限检查、会话事件等关键路径可输出结构化字段。
  3. 为普通入口增加结构化日志开关,支持通过 CLI 和环境变量启用。
  4. 补齐关键异常路径的日志落盘。
  5. 保证工具执行失败和崩溃可以稳定记录到日志文件。
  6. 统一 logger 使用方式,避免绕过 minicode logger 树。

Proposed Changes

1. 修正日志轮转描述

  • 更新 minicode/logging_config.py 中关于日志轮转的注释与说明。
  • 明确当前正式策略为:按大小轮转。
  • 清理或重命名未实际使用的时间轮转相关配置,避免误导。

2. 接入结构化日志能力

  • 在模型调用完成后记录 API 调用日志,包含:
    • 模型名称
    • token 输入/输出
    • cost
    • duration
  • 在工具执行结束后记录工具执行日志,包含:
    • tool name
    • success/failure
    • duration
    • error category
  • 在权限决策路径中记录权限检查日志。
  • 在会话启动、恢复、保存、关闭等节点记录会话事件日志。

3. 暴露结构化日志开关

  • 为 CLI 增加显式参数,例如:
    • --structured-logs
  • 为 headless/普通运行入口增加环境变量开关,例如:
    • MINI_CODE_LOG_STRUCTURED=true
  • 确保普通文本日志和 JSON 日志都可通过统一入口启用。

4. 补齐关键错误落盘

  • 对配置加载失败等当前只 print(..., file=sys.stderr) 的关键路径补充日志记录。
  • 在保留用户可见提示的同时,确保错误细节进入日志文件。

5. 优化工具崩溃日志覆盖

  • ToolRegistry.execute() 捕获工具异常时调用 logger.error(...)logger.exception(...)
  • 保持当前 ToolResult 返回逻辑不变,避免破坏上层行为。
  • 确保“用户可见错误”和“日志可检索错误”同时存在。

6. 统一 logger 命名空间

  • 检查并替换直接使用模块级 logging.debug(...) 的路径。
  • 统一改为 get_logger(...)logging.getLogger("minicode.xxx") 方式。
  • 避免日志误打到 root logger 或意外输出到 stderr

Suggested Scope

  • minicode/logging_config.py
  • minicode/main.py
  • minicode/headless.py
  • minicode/tooling.py
  • minicode/tty_app.py
  • 与权限、会话、模型调用链路相关的必要模块
  • 对应测试文件

Acceptance Criteria

  • 日志系统注释与实际行为一致,正式策略明确为“按大小轮转”。
  • API 调用、工具执行、权限检查、会话事件可进入日志系统。
  • CLI 和 headless 模式可通过参数或环境变量启用结构化日志。
  • 配置加载失败等关键错误会写入日志文件,而不仅仅打印到 stderr
  • 工具内部异常在返回 ToolResult 的同时,会被写入日志文件。
  • 所有核心模块统一使用 minicode.* logger 命名空间。
  • 新增或补充测试,覆盖:
    • 结构化日志开关
    • 关键错误落盘
    • 工具崩溃日志
    • logger 命名空间一致性

Ownership

  • 申领人:@dddleader
  • 计划处理方式:先修正配置与入口,再补齐核心链路埋点,最后补测试和文档。

Implementation Notes

  • 为了降低改动风险,建议保持现有 setup_logging() 作为统一入口,不在各模块各自创建 handler。
  • 工具崩溃日志建议优先记录异常类型、工具名、简要输入摘要和 traceback 摘要。
  • 结构化日志字段建议优先复用当前 StructuredFormatter 已支持的字段,避免先扩格式、后补埋点造成不一致。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions