Files
sub2api/logging_audit_20260212.md
yangjianbo 584cfc3db2 chore(logging): 完成后端日志审计与结构化迁移
- 将高密度服务与处理器日志迁移到新日志系统(LegacyPrintf/结构化日志)
- 增加 stdlog bridge 与兼容测试,保留旧日志捕获能力
- 将 OpenAI 断流告警改为结构化 Warn 并改造对应测试为 sink 捕获
- 补齐后端相关文件 logger 引用并通过全量 go test
2026-02-12 19:01:09 +08:00

6.8 KiB
Raw Blame History

日志专项审计与整理2026-02-12

1. 全量扫描结论

  • 扫描范围:backend/ + frontend/
  • 日志相关调用总量(粗统计):约 4100
  • 后端标准库日志(log.Printf/Println/Fatal*808 处(本轮整改后剩余 269 处)
  • 前端 console.*180

关键观察:

  1. 后端大量业务日志仍走标准库 log,在当前初始化流程里会被统一当作 INFO 输出,导致“错误/告警等级失真”。
  2. 网关关键链路OpenAI/Gemini/Sora原有日志以格式化字符串为主上下文字段request_id/user_id/group_id/model/account_id)不完整,排障时需要人工拼接上下文。
  3. Token 刷新服务同时混用 logslog,同类事件日志风格不一致,不利于检索与聚合。
  4. 前端 console.error/warn 使用量高,缺少统一封装,生产环境噪音和敏感信息泄漏风险较高。

2. 本次已落地整改

2.1 全局层(后端标准库日志分级修复)

  • 修改:backend/internal/pkg/logger/logger.go
  • 结果:
    1. 替换原 zap.RedirectStdLogAt(..., INFO) 机制,改为自定义 stdlog bridge
    2. 对标准库日志自动推断等级(DEBUG/WARN/ERROR/INFO),并打上 legacy_stdlog=true 标记。
    3. 规范化消息文本(去换行、压缩空白),提升可读性和检索稳定性。
    4. 调整初始化顺序:先桥接 slog,再桥接 stdlog,避免 slog.SetDefault 覆盖标准库桥接。
    5. 新增 logger.LegacyPrintf(component, format, ...args),用于后端历史 printf 日志的平滑迁移,自动推断等级并打 legacy_printf=true 标记。

2.2 核心请求链路结构化改造

  • 新增:backend/internal/handler/logging.go

    • 统一提供请求级 logger 获取入口,继承中间件注入的 request_id 上下文。
  • 改造文件:

    • backend/internal/handler/gateway_handler.go
    • backend/internal/handler/openai_gateway_handler.go
    • backend/internal/handler/gemini_v1beta_handler.go
    • backend/internal/handler/sora_gateway_handler.go
    • backend/internal/service/antigravity_gateway_service.go
    • backend/internal/service/gateway_service.go
    • backend/internal/service/gemini_oauth_service.go
    • backend/internal/service/auth_service.go
    • backend/internal/setup/setup.go
    • backend/internal/service/usage_cleanup_service.go
    • backend/internal/service/pricing_service.go
    • backend/internal/repository/account_repo.go
    • backend/internal/service/openai_gateway_service.go
    • backend/internal/service/scheduler_snapshot_service.go
    • backend/internal/service/gemini_messages_compat_service.go
    • backend/internal/service/dashboard_aggregation_service.go
    • backend/internal/service/billing_cache_service.go
    • backend/internal/repository/claude_oauth_service.go
    • backend/internal/service/admin_service.go
    • backend/internal/handler/admin/ops_ws_handler.go
  • 改造内容:

    1. 把关键日志从字符串拼接改为结构化字段。
    2. 统一带上 component/user_id/api_key_id/group_id/model/account_id 等字段。
    3. 按语义拆分等级:
      • 预期业务拒绝(如账单校验失败、队列满)使用 Info
      • 降级路径/可恢复异常(如抢槽失败、粘性会话绑定失败)使用 Warn
      • 真正故障(如转发失败、使用量记录失败)使用 Error
    4. 新增请求完成日志(*.request_completed)用于链路闭环追踪。
    5. 对高密度 log.Printf 完成批量迁移到 logger.LegacyPrintf(本轮累计 511 处),并统一组件字段:
      • component=service.antigravity_gateway
      • component=service.gateway
      • component=service.gemini_oauth
      • component=service.auth
      • component=setup
      • component=service.usage_cleanup
      • component=service.pricing
      • component=repository.account
      • component=service.openai_gateway
      • component=service.scheduler_snapshot
      • component=service.gemini_messages_compat
      • component=service.dashboard_aggregation
      • component=service.billing_cache
      • component=repository.claude_oauth
      • component=service.admin
      • component=handler.admin.ops_ws
    6. OpenAI 透传断流相关两条关键告警统一回到新日志系统输出(service.openai_gateway),并通过兼容逻辑保证测试环境可捕获。

2.3 后台任务日志统一

  • 改造:backend/internal/service/token_refresh_service.go
  • 结果:
    1. 统一改为 slog 结构化输出。
    2. retry/cycle/account 等事件改为字段化日志,便于按账号和批次检索。
    3. 对“无实际刷新活动”的周期日志降级到 Debug,减少噪音。

2.4 测试保障

  • 新增:backend/internal/pkg/logger/stdlog_bridge_test.go
    • 覆盖标准库日志等级推断、消息标准化、输出路由行为。
  • 已验证:
    • go test ./internal/pkg/logger ./internal/handler ./internal/service 通过。

3. 仍需继续整改(建议下一批)

3.1 后端剩余 std log 高密度区域(优先级 P1

建议优先处理以下文件(调用量高):

  1. backend/internal/service/usage_cleanup_service.go26
  2. backend/internal/service/pricing_service.go26
  3. backend/internal/repository/account_repo.go24
  4. backend/internal/service/openai_gateway_service.go23
  5. backend/internal/service/scheduler_snapshot_service.go20

(以上已完成。当前 Top 5 已变为:backend/cmd/server/main.gobackend/internal/service/openai_tool_corrector.gobackend/internal/service/email_queue_service.gobackend/internal/config/config.gobackend/internal/service/ops_cleanup_service.go

目标:逐步替换为结构化日志,减少对 legacy_stdlog 兼容桥接的依赖。

3.2 前端日志治理(优先级 P1

建议新增统一前端日志工具(如 src/utils/logger.ts)并分三步替换:

  1. console.error/warn/debug/log 全部收敛到统一 API
  2. 生产环境默认降噪(仅保留关键告警/错误);
  3. 统一字段模块名、请求ID、用户ID、路由、错误码并避免打印敏感数据。

3.3 日志规范与门禁(优先级 P2

建议补充:

  1. 日志规范文档(等级定义、字段最小集、脱敏要求);
  2. CI 检查规则:限制新增裸 log.Printf / console.*
  3. 面向运营告警的事件白名单(例如 *.forward_failed*.retry_exhausted*)。

4. 本次整理后可直接使用的检索建议

  1. 过滤历史兼容日志:legacy_stdlog=true
  2. 网关入口故障:component=handler.* AND level in (WARN,ERROR)
  3. 请求闭环:按 request_id + *.request_completed + *.forward_failed
  4. token 刷新故障:component=*token_refresh* AND (retry_attempt_failed OR set_error_status_failed)