Issue Draft: Logging System Hardening and Structured Logging Exposure
Summary
当前日志系统已经具备基础能力,但存在注释与实现不一致、结构化日志能力未真正接入、关键错误未完整落盘、工具崩溃缺少日志记录、以及 logger 使用不统一等问题。
这些问题会影响线上排障、问题回溯、日志分析和后续可观测性建设。
本 issue 目标是统一并补强现有日志系统,在保持“按大小轮转”这一简单稳定策略的前提下,让结构化日志真正可用,并确保关键失败路径稳定写入日志文件。
Background
当前代码中的主要问题点如下:
minicode/logging_config.py 注释声称支持“按大小 + 按时间轮转”,但实际只使用了 RotatingFileHandler。
StructuredFormatter 及 log_api_call、log_tool_execution、log_permission_check、log_session_event 等辅助函数已经存在,但未在主流程中有效接入。
- 普通运行入口未暴露结构化日志开关,用户无法通过 CLI 或环境变量启用 JSON 日志。
- 一些关键失败场景仅输出到
stderr,未写入日志文件。
ToolRegistry.execute() 会把工具异常包装成 ToolResult 返回,但不会同步写日志,导致某些工具崩溃只能在会话输出中看到,无法在日志文件中检索。
- 个别模块未统一使用
minicode.* logger 命名空间,存在日志旁路到 root logger 的风险。
Goals
- 明确日志轮转策略,以“按大小轮转”为唯一正式策略,并修正文档/注释。
- 打通结构化日志能力,使 API、工具执行、权限检查、会话事件等关键路径可输出结构化字段。
- 为普通入口增加结构化日志开关,支持通过 CLI 和环境变量启用。
- 补齐关键异常路径的日志落盘。
- 保证工具执行失败和崩溃可以稳定记录到日志文件。
- 统一 logger 使用方式,避免绕过
minicode logger 树。
Proposed Changes
1. 修正日志轮转描述
- 更新
minicode/logging_config.py 中关于日志轮转的注释与说明。
- 明确当前正式策略为:按大小轮转。
- 清理或重命名未实际使用的时间轮转相关配置,避免误导。
2. 接入结构化日志能力
- 在模型调用完成后记录 API 调用日志,包含:
- 模型名称
- token 输入/输出
- cost
- duration
- 在工具执行结束后记录工具执行日志,包含:
- tool name
- success/failure
- duration
- error category
- 在权限决策路径中记录权限检查日志。
- 在会话启动、恢复、保存、关闭等节点记录会话事件日志。
3. 暴露结构化日志开关
- 为 CLI 增加显式参数,例如:
- 为 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
Ownership
- 申领人:
@dddleader
- 计划处理方式:先修正配置与入口,再补齐核心链路埋点,最后补测试和文档。
Implementation Notes
- 为了降低改动风险,建议保持现有
setup_logging() 作为统一入口,不在各模块各自创建 handler。
- 工具崩溃日志建议优先记录异常类型、工具名、简要输入摘要和 traceback 摘要。
- 结构化日志字段建议优先复用当前
StructuredFormatter 已支持的字段,避免先扩格式、后补埋点造成不一致。
Issue Draft: Logging System Hardening and Structured Logging Exposure
Summary
当前日志系统已经具备基础能力,但存在注释与实现不一致、结构化日志能力未真正接入、关键错误未完整落盘、工具崩溃缺少日志记录、以及 logger 使用不统一等问题。
这些问题会影响线上排障、问题回溯、日志分析和后续可观测性建设。
本 issue 目标是统一并补强现有日志系统,在保持“按大小轮转”这一简单稳定策略的前提下,让结构化日志真正可用,并确保关键失败路径稳定写入日志文件。
Background
当前代码中的主要问题点如下:
minicode/logging_config.py注释声称支持“按大小 + 按时间轮转”,但实际只使用了RotatingFileHandler。StructuredFormatter及log_api_call、log_tool_execution、log_permission_check、log_session_event等辅助函数已经存在,但未在主流程中有效接入。stderr,未写入日志文件。ToolRegistry.execute()会把工具异常包装成ToolResult返回,但不会同步写日志,导致某些工具崩溃只能在会话输出中看到,无法在日志文件中检索。minicode.*logger 命名空间,存在日志旁路到 root logger 的风险。Goals
minicodelogger 树。Proposed Changes
1. 修正日志轮转描述
minicode/logging_config.py中关于日志轮转的注释与说明。2. 接入结构化日志能力
3. 暴露结构化日志开关
--structured-logsMINI_CODE_LOG_STRUCTURED=true4. 补齐关键错误落盘
print(..., file=sys.stderr)的关键路径补充日志记录。5. 优化工具崩溃日志覆盖
ToolRegistry.execute()捕获工具异常时调用logger.error(...)或logger.exception(...)。ToolResult返回逻辑不变,避免破坏上层行为。6. 统一 logger 命名空间
logging.debug(...)的路径。get_logger(...)或logging.getLogger("minicode.xxx")方式。stderr。Suggested Scope
minicode/logging_config.pyminicode/main.pyminicode/headless.pyminicode/tooling.pyminicode/tty_app.pyAcceptance Criteria
stderr。ToolResult的同时,会被写入日志文件。minicode.*logger 命名空间。Ownership
@dddleaderImplementation Notes
setup_logging()作为统一入口,不在各模块各自创建 handler。StructuredFormatter已支持的字段,避免先扩格式、后补埋点造成不一致。