创建仓库
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
---
|
||||
tags: []
|
||||
aliases:
|
||||
- 📋 Global Logging Infrastructure - Task Checklist
|
||||
date created: 星期三, 十二月 10日 2025, 11:55:42 晚上
|
||||
date modified: 星期三, 十二月 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` 结构体需包含 `mapstructure` tag 以适配外部 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)。
|
||||
|
||||
- [ ] **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。
|
||||
|
||||
- [ ] **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`,打通后续所有层的日志链路。
|
||||
|
||||
- [ ] **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 代码?
|
||||
Reference in New Issue
Block a user