5.0 KiB
5.0 KiB
Rust shared-logging crate 设计
日期:2026-04-21
1. 文档目的
这份文档用于明确 server-rs/ 下统一日志模块的落地方式。
目标是把当前仅存在于 crates/api-server/src/logging.rs 的日志初始化逻辑,上提为一个可被多 crate 复用的独立 shared-logging crate,并固定:
- 统一日志模块的职责边界
api-server、后续spacetime-module、测试支撑与脚本入口的复用方式- 日志过滤、subscriber 初始化、输出风格的统一口径
- 不允许继续把日志初始化散落到各主工程 crate 中
2. 当前基线
当前 Rust 工作区里的日志实现现状:
api-server内部已有src/logging.rs- 该文件负责创建
EnvFilter并初始化tracing subscriber main.rs直接调用init_tracing(&config)- 其它 crate 尚未复用同一套日志初始化逻辑
当前问题:
- 日志初始化逻辑被绑定在
api-server内部,无法作为工作区级共享能力复用 - 后续
spacetime-module、测试支撑、独立 worker、脚本入口若需要日志,会继续复制粘贴 - 当前没有独立 crate 作为“统一日志模块”承接输出风格、默认过滤器与 subscriber 初始化边界
3. crate 职责边界
3.1 shared-logging 负责
- 提供工作区统一的
tracing subscriber初始化入口 - 提供统一的日志过滤器解析逻辑
- 固定当前阶段的输出风格,例如
compact、with_target(true) - 为
api-server、后续spacetime-module、测试支撑与独立入口提供可复用初始化函数
3.2 它不负责
- 保存业务日志事件结构体
- 直接耦合
Axum中间件或TraceLayer - 处理业务 request id、response headers、error body
- 承担供应商日志上报、链路追踪采样、远端日志聚合
3.3 与其他 crate 的边界
shared-logging只提供“日志基础设施初始化”api-server继续负责 HTTP 访问日志的TraceLayer挂载request_context、错误中间件、响应头模块继续负责 request id 与响应元信息串联- 若未来需要结构化埋点或审计事件,应进入对应业务 crate,不进入
shared-logging
4. 目录与命名
统一落位:
server-rs/crates/shared-logging
当前阶段建议最小文件结构:
server-rs/crates/shared-logging/
├─ Cargo.toml
├─ README.md
└─ src/
└─ lib.rs
说明:
- 当前阶段只做库 crate,不做独立二进制入口
api-server从src/logging.rs迁出后,直接依赖shared-logging
5. API 设计
当前阶段建议提供以下最小 API:
init_tracing(log_filter: &str) -> Result<(), io::Error>resolve_env_filter(default_filter: &str) -> EnvFilter
设计原因:
api-server当前只需要一个初始化入口- 后续如
spacetime-module需要不同默认过滤器,也可以复用resolve_env_filter(...) - 避免在第一版就过度设计成复杂 builder
6. 配置约定
当前阶段仍保留现有配置来源:
api-server默认读取GENARRATIVE_API_LOG- 若环境变量未提供,则回落到配置对象中的
log_filter shared-logging不直接读取业务配置结构,只消费最终传入的默认 filter 字符串
这样做的原因:
- 保持
shared-logging对上层业务配置解耦 - 避免把
AppConfig类型反向沉到共享基础设施 crate
7. 输出风格约定
当前阶段固定沿用现有输出口径:
compactwith_target(true)- 基于
EnvFilter做过滤
说明:
- 先保证工作区统一
- 后续若要引入 JSON 输出、环境区分或远端采集,再在
shared-logging中集中演进
8. 落地规则
8.1 api-server
必须调整为:
- 删除本地
src/logging.rs - 在
Cargo.toml中引用shared-logging main.rs改为调用shared_logging::init_tracing(...)
8.2 其它 crate
后续若需要日志初始化,统一按以下规则:
- 优先依赖
shared-logging - 不再在各自 crate 内重复实现一份
init_tracing
9. 不允许的设计漂移
后续实现时禁止出现以下情况:
- 再为
api-server、spacetime-module各自复制一份 subscriber 初始化逻辑 - 把
Axum的TraceLayer直接塞进shared-logging - 把 request id、响应头、错误 envelope 这些 HTTP 语义放进
shared-logging - 为了抽象而把业务配置类型强耦合进共享日志 crate
10. 本任务完成定义
当以下条件满足时,统一日志模块任务视为完成:
shared-loggingcrate 已创建并加入 workspaceapi-server已改为依赖shared-logging- 原
api-server/src/logging.rs已被移除 - 工作区文档与任务清单已同步到“统一日志模块”口径
11. 依据文件
server-rs/crates/api-server/src/logging.rsserver-rs/crates/api-server/src/main.rsserver-rs/crates/api-server/src/config.rsserver-rs/crates/api-server/README.mdbackend-rewrite-tasklist/01_M0_M2_FOUNDATION_AND_AUTH.md