1
0
Files
nex/openspec/specs/gorm-logging/spec.md
lanyuanxiaoyao 280099b89c refactor: 后端日志系统重构
- 新增模块化日志器(pkg/logger/module.go)
- 新增 GORM 日志适配器
- 统一日志入口,移除所有 zap.L() 全局 logger 调用
- 字段标准化
- 启动阶段使用结构化日志
- 更新所有相关测试
2026-04-23 18:37:51 +08:00

2.5 KiB
Raw Blame History

GORM Logging

Purpose

定义 GORM 日志适配器规范,将 GORM 日志桥接到 zap实现数据库操作日志统一格式和请求追踪。

Requirements

Requirement: GORM 日志适配器

系统 SHALL 提供 GORM 日志适配器,桥接到 zap。

Scenario: 适配器实现

  • WHEN 初始化数据库连接
  • THEN SHALL 使用 logger.NewGormLogger(zapLogger) 作为 GORM logger
  • THEN 适配器 SHALL 实现 gorm.logger.Interface 接口

Scenario: 日志级别映射

  • WHEN GORM 记录日志
  • THEN GORM Silent SHALL 映射到不输出
  • THEN GORM Error SHALL 映射到 zap.ErrorLevel
  • THEN GORM Warn SHALL 映射到 zap.WarnLevel
  • THEN GORM Info SHALL 映射到 zap.DebugLevel

Scenario: SQL 查询日志

  • WHEN GORM 执行 SQL 查询
  • THEN SHALL 使用 zap Debug 级别记录
  • THEN SHALL 包含 SQL 语句
  • THEN SHALL 包含执行耗时
  • THEN SHALL 包含影响行数(如有)

Requirement: Request ID 关联

GORM 日志 SHALL 支持 request_id 关联。

Scenario: 从 Context 提取 request_id

  • WHEN GORM 记录日志
  • THEN SHALL 从 context.Context 提取 request_id
  • THEN 日志 SHALL 包含 request_id 字段

Scenario: Context 传播

  • WHEN 使用 GORM 进行数据库操作
  • THEN SHALL 使用 db.WithContext(ctx) 传递 context
  • THEN GORM 日志 SHALL 自动包含 request_id

Requirement: 模块标识

GORM 日志 SHALL 包含模块标识。

Scenario: 数据库模块标识

  • WHEN GORM 记录日志
  • THEN SHALL 包含 logger: database 标识
  • THEN Console 格式 SHALL 输出为 [database]

Requirement: 单行输出

GORM 日志 SHALL 单行输出。

Scenario: SQL 单行输出

  • WHEN 记录 SQL 查询日志
  • THEN SHALL 单行输出
  • THEN SQL 语句中的换行 SHALL 替换为空格(除非保留原始格式)

Scenario: 错误日志单行

  • WHEN 记录数据库错误日志
  • THEN SHALL 单行输出
  • THEN 错误详情 SHALL 作为字段值

Requirement: 日志字段标准化

GORM 日志 SHALL 使用标准化字段。

Scenario: SQL 日志字段

  • WHEN 记录 SQL 查询
  • THEN SHALL 使用 sql 字段记录 SQL 语句
  • THEN SHALL 使用 rows_affected 字段记录影响行数
  • THEN SHALL 使用 latency 字段记录执行耗时

Scenario: 错误日志字段

  • WHEN 记录数据库错误
  • THEN SHALL 使用 zap.Error(err) 记录错误
  • THEN SHALL NOT 使用 zap.String("error", err.Error())