Files
pig-farm-controller/design/provide-logger-with-mothed/task-list.md
2025-11-05 23:57:09 +08:00

4.0 KiB
Raw Blame History

重构任务清单:纯 Context 驱动的调用链追踪


1. 核心改造 (logs 包)

  • internal/infra/logs/logs.go (logs.Logger - 内部实现,非注入)
    • 核心包级函数实现 (根据 implementation.md 描述):
      • 实现 AddCompName(ctx context.Context, compName string) context.Context
      • 实现 AddFuncName(upstreamCtx context.Context, selfCtx context.Context, funcName string) context.Context
      • 实现 GetLogger(ctx context.Context) *Logger
      • 实现 Trace(upstreamCtx context.Context, selfCtx context.Context, funcName string) (context.Context, *Logger)
    • Logger 结构体改造:
    • GormLogger 改造:
      • 修改 GormLogger.Info 方法,从传入的 ctx 中获取 logger 实例,并使用该实例进行日志记录。
      • 修改 GormLogger.Warn 方法,从传入的 ctx 中获取 logger 实例,并使用该实例进行日志记录。
      • 修改 GormLogger.Error 方法,从传入的 ctx 中获取 logger 实例,并使用该实例进行日志记录。
      • 修改 GormLogger.Trace 方法,从传入的 ctx 中获取 logger 实例,并使用该实例进行日志记录。特别是 With(fields...) 的调用需要调整。

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 层

api controller middleware webhook

3.2. 应用层 (Application Services)

service

3.3. 领域层 (Domain Services)

domain

3.4. 基础设施层 (Infrastructure)

repository infra-other


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)