4.2 KiB
4.2 KiB
tags, aliases, date created, date modified
| tags | aliases | date created | date modified | |
|---|---|---|---|---|
|
星期三, 十二月 10日 2025, 11:55:42 晚上 | 星期三, 十二月 10日 2025, 11:56:24 晚上 |
收到。作为系统架构师,我已根据《全局日志模块详细设计说明书》及 SOP 要求,完成了依赖隔离任务拆解 (Dependency-Aware MECE Breakdown)。
此拆解方案严格遵循 Level 0 (Core) 与 Level 1 (Integration) 的物理隔离,确保核心日志包零依赖于业务框架。
📋 Global Logging Infrastructure - Task Checklist
Phase 1: Batch A - Core Implementation (Level 0)
目录: internal/pkg/log
约束: 仅依赖 zap, lumberjack, context。严禁 import gin, viper。
-
Batch A - Step 1: 配置与标准定义 (
options.go,standard.go)- 核心职责: 定义日志配置结构体 (Config Struct) 及全局统一的键名常量 (Standard Keys)。
- 关键设计:
Options结构体需包含mapstructuretag 以适配外部 Viper 解析。- 预定义
trace_id,user_id等常量为snake_case,杜绝魔法字符串。 - 包含
DefaultOptions()返回生产环境推荐配置 (100MB, Compress=true)。
-
Batch A - Step 2: 核心构建与 IO (
writer.go,zap.go)- 核心职责: 封装 Lumberjack 文件轮转逻辑,构建
zap.Core与zap.Logger实例。 - 关键设计:
- IO 分离:
writer.go实现zapcore.WriteSyncer,强制开启Compress: true。 - 环境隔离:
zap.go根据配置决定使用JSON Encoder(Prod) 或Console Encoder(Dev)。 - 双写机制: 实现 Tee 模式,同时输出到文件和控制台 (Stdout)。
- IO 分离:
- 核心职责: 封装 Lumberjack 文件轮转逻辑,构建
-
Batch A - Step 3: 上下文桥接 (
context.go)- 核心职责: 实现标准
context.Context到zap.Field的转换逻辑。 - 关键设计:
- TraceID 注入: 实现
WithContext(ctx),从 Context 提取 TraceID 并返回带有trace_id字段的*zap.Logger。 - 后台播种: 实现
StartBackgroundTrace(ctx),为 Cron/Goroutine 任务生成根 TraceID。 - 零侵入: 仅依赖标准库 Context,不依赖 Gin Context。
- TraceID 注入: 实现
- 核心职责: 实现标准
-
Batch A - Step 4: 全局门面 (
log.go)- 核心职责: 管理全局单例 (Singleton),提供静态代理方法 (Static Proxy)。
- 关键设计:
- 懒汉兜底:
globalLogger默认初始化为 Console Logger (Nop),防止未调用Init时 Panic。 - Caller 修正: 静态方法 (
log.Info) 必须使用AddCallerSkip(1),确保日志行号指向业务代码而非log.go。 - 并发安全:
Init()必须使用sync.Once或互斥锁保护。
- 懒汉兜底:
Phase 2: Batch B - Middleware Integration (Level 1)
目录: internal/middleware
约束: 依赖 internal/pkg/log, gin, pkg/app。
-
Batch B - Step 1: 链路追踪中间件 (
trace.go)- 核心职责: 请求入口处的 TraceID 生成与注入。
- 关键设计:
- 优先读取 Header
X-Trace-ID,无则生成 UUID。 - 关键动作: 调用
log.WithTraceID(ctx, id)将 ID 注入 Standard Context,再回写到c.Request,打通后续所有层的日志链路。
- 优先读取 Header
-
Batch B - Step 2: 访问日志中间件 (
access_log.go)- 核心职责: 记录 HTTP 请求的黄金指标 (Golden Signals)。
- 关键设计:
- 必须使用
log.WithContext(c.Request.Context())打印,确保包含 TraceID。 - 记录字段:
method,path,status,latency(ms),client_ip。
- 必须使用
-
Batch B - Step 3: 灾难恢复中间件 (
recovery.go)- 核心职责: 替换 Gin 默认 Recovery,提供结构化 Panic 日志。
- 关键设计:
- 捕获
panic-> 获取 Stack Trace -> 构造 JSON Error 日志 (包含stack字段)。 - 联动
pkg/app返回标准 JSON 500 响应,通过pkg/log记录系统级错误。
- 捕获
🏁 Next Action
建议按照 Checklist 顺序,从 Batch A - Step 1 开始执行。是否现在开始 Phase 0.5 (API 签名锁定) 或直接生成 Step 1 代码?