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

6.6 KiB
Raw Blame History

重构任务清单:纯 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, initAppServicesapi.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 组件本身创建 selfCtxselfCtx := 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.Tracelogs.AddFuncName 创建新的 ContextLogger
      • 关键: 使用 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)