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

93 lines
2.5 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.
# 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())`