Files
pig-farm-controller/design/provide-logger-with-mothed/task-list.md
2025-11-03 21:11:19 +08:00

108 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### 重构任务清单:纯 Context 驱动的调用链追踪
---
#### 1. 核心改造 (`logs` 包)
- **`internal/infra/logs/logs.go`**:
- [ ] 实现 `AddCompName`, `AddFuncName`, `GetLogger`, `Trace` 四个核心包级函数。
- [ ] 移除旧 `Logger` 结构体中的状态字段(如 `component`)。
---
#### 2. 依赖注入与结构体改造
- **`internal/core/application.go`**:
- [ ] 移除 `Application` 结构体中的 `Logger *logs.Logger` 成员。
- [ ] 修改 `NewApplication` 函数,使其不再创建 `logger`,而是创建根 `context.Background()`
- [ ] 调整 `NewApplication`,将根 `context` 传递给 `initInfrastructure`, `initDomainServices`, `initAppServices``api.NewAPI`
- [ ] 移除 `Application` 结构体中所有对 `app.Logger` 的直接调用,改为通过 `context` 获取 `Logger`
- **`internal/core/component_initializers.go`**:
- [ ] **修改所有组件结构体定义**: 遍历所有相关组件Controllers, Services, Repositories 等),将其结构体中的 `logger *logs.Logger` 成员变量替换为 `selfCtx context.Context`
- [ ] **重构所有 `init...` 函数**:
- 移除所有 `logger *logs.Logger` 参数,改为接收 `ctx context.Context`
- 在每个 `init...` 函数内部,为即将创建的组件生成其专属的 `selfCtx`。例如:`selfCtx := logs.AddCompName(ctx, "ComponentName")`
- 将这个 `selfCtx` 注入到组件的构造函数中,并由组件保存为 `selfCtx` 成员。
---
#### 3. 全局方法签名改造:传递 `context.Context`
**以下所有列出的组件,其所有公共方法都需要进行签名改造,将 `ctx context.Context` 作为第一个参数。**
##### 3.1. API 层
- **`internal/app/api/api.go` (`API`)**:
- [ ] 修改 `NewAPI` 函数,移除 `logger` 参数,改为接收 `ctx context.Context`
- [ ] 移除 `API` 结构体中的 `logger` 成员,改为保存 `selfCtx context.Context`
- [ ] 为 `API` 组件本身创建 `selfCtx``selfCtx := logs.AddCompName(ctx, "API")`,并传递给所有 `Controller` 的构造函数。
- **`internal/app/controller/user/user_controller.go` (`user.Controller`)**
- **`internal/app/controller/device/device_controller.go` (`device.Controller`)**
- **`internal/app/controller/plan/plan_controller.go` (`plan.Controller`)**
- **`internal/app/controller/management/pig_farm_controller.go` (`management.PigFarmController`)**
- **`internal/app/controller/management/pig_batch_controller.go` (`management.PigBatchController`)**
- **`internal/app/controller/monitor/monitor_controller.go` (`monitor.Controller`)**
- **改造动作**:
- [ ] 修改 `NewController` 函数,移除 `logger` 参数,改为接收 `selfCtx context.Context`
- [ ] 移除 `Controller` 结构体中的 `logger` 成员,改为保存 `selfCtx`
- [ ] **所有公共方法**: 接收 `echo.Context` 的方法,需要从中提取 `request.Context()` 作为 `upstreamCtx`
- **`internal/app/middleware/auth.go`**
- **`internal/app/middleware/audit.go`**
- **改造动作**:
- [ ] 检查并重构所有日志记录中间件。
- [ ] 中间件应该从请求的 `c.Request().Context()` 中提取 `upstreamCtx`
- [ ] 使用 `logs.Trace``logs.AddFuncName` 创建新的 `Context``Logger`
- [ ] **关键**: 使用 `c.SetRequest(c.Request().WithContext(newCtx))` 将更新后的 `Context` 写回 `echo.Context`,以便传递给后续的中间件和 `Controller`
##### 3.2. 应用层 (Application Services)
- **`internal/app/service/pig_farm_service.go` (`service.PigFarmService`)**
- **`internal/app/service/pig_batch_service.go` (`service.PigBatchService`)**
- **`internal/app/service/monitor_service.go` (`service.MonitorService`)**
- **`internal/app/service/device_service.go` (`service.DeviceService`)**
- **`internal/app/service/plan_service.go` (`service.PlanService`)**
- **`internal/app/service/user_service.go` (`service.UserService`)**
##### 3.3. 领域层 (Domain Services)
- **`internal/domain/audit/service.go` (`audit.Service`)**
- **`internal/domain/device/general_device_service.go` (`device.Service`)**
- **`internal/domain/notify/notify.go` (`domain_notify.Service` - `failoverService` 实现)**
- **`internal/domain/pig/pen_transfer_manager.go` (`pig.PigPenTransferManager`)**
- **`internal/domain/pig/pig_trade_manager.go` (`pig.PigTradeManager`)**
- **`internal/domain/pig/pig_sick_manager.go` (`pig.SickPigManager`)**
- **`internal/domain/pig/pig_batch_service.go` (`pig.PigBatchService`)**
- **`internal/domain/plan/analysis_plan_task_manager.go` (`plan.AnalysisPlanTaskManager`)**
- **`internal/domain/plan/plan_execution_manager.go` (`plan.ExecutionManager`)**
- **`internal/domain/plan/plan_service.go` (`plan.Service`)**
- **`internal/domain/task/task.go` (`task.TaskFactory`)**
##### 3.4. 基础设施层 (Infrastructure)
- **`internal/infra/database/storage.go` (`database.Storage`)**
- **`internal/infra/logs/logs.go` (`logs.Logger` - 内部实现,非注入)**
- **`internal/infra/notify/log_notifier.go` (`notify.LogNotifier`)**
- **`internal/infra/repository/unit_of_work.go` (`repository.UnitOfWork` - `gormUnitOfWork` 实现)**
- **`internal/infra/transport/lora/chirp_stack.go` (`lora.ChirpStackTransport`)**
- **`internal/infra/transport/lora/lora_mesh_uart_passthrough_transport.go` (`lora.LoRaMeshUartPassthroughTransport`)**
- **`internal/infra/transport/lora/placeholder_transport.go` (`lora.PlaceholderTransport`)**
- **`internal/app/webhook/chirp_stack.go` (`webhook.ChirpStackListener`)**
- **`internal/app/webhook/placeholder_listener.go` (`webhook.PlaceholderListener`)**
---
#### 4. 日志调用点及方法内部逻辑改造
- [ ] **遍历所有业务方法** (针对上述所有列出的组件的公共方法):
- [ ] **定位旧日志**: 搜索所有对旧 `z.logger.*` 成员的调用。
- [ ] **改造方法入口** (对于非 Controller 方法):
1. 在方法开始处,使用作为参数传入的 `ctx` (作为 `upstreamCtx`) 和组件自身持有的 `z.selfCtx`,调用 `logs.Trace`
- `newCtx, logger := logs.Trace(ctx, z.selfCtx, "MethodName")`
2. 将所有旧的 `z.logger.*(...)` 调用,替换为使用新获取的 `logger.*(...)`
- [ ] **改造下游调用**:
1. 在方法内部,当需要调用其他组件的方法时(如下游服务),**必须传递 `newCtx`**。
- `err := z.downstreamService.DoSomething(newCtx, data)`