Skip to content

Comments

refactor(clog): 改进 API 设计并修复 With 字段污染问题#35

Merged
ceyewan merged 2 commits intomainfrom
review/clog-for-v0.4.0
Jan 28, 2026
Merged

refactor(clog): 改进 API 设计并修复 With 字段污染问题#35
ceyewan merged 2 commits intomainfrom
review/clog-for-v0.4.0

Conversation

@ceyewan
Copy link
Owner

@ceyewan ceyewan commented Jan 28, 2026

概述

本次 PR 对 clog 组件进行了重要改进,包括 API 重构、Bug 修复和代码质量提升,为 v0.4.0 版本发布做准备。

主要变更

1. API 改进

  • 移除 WithStandardContext():该函数强制使用固定的字段名(trace_id, user_id, request_id),缺乏灵活性
  • 推广 WithContextField():允许用户自定义从 Context 中提取任意字段,提供更好的可控性
  • 更新文档和示例:README 和示例代码均已更新,展示推荐用法
// 新的推荐用法
logger, _ := clog.New(&clog.Config{Level: "info"},
    clog.WithContextField("trace_id", "trace_id"),
    clog.WithContextField("user_id", "user_id"),
    clog.WithContextField("request_id", "request_id"),
)

2. 修复 With 字段污染 Bug

问题描述:使用 With() 创建派生 Logger 时,如果基础 Logger 的 baseAttrs 数组有多余容量,后续派生操作可能会覆盖已有字段。

修复方案:在 With() 方法中显式复制 baseAttrs 数组,避免多个派生 Logger 共享底层数组。

回归测试:新增 TestLoggerWith_DerivedLoggerDoesNotMutateSiblings 测试用例,覆盖该边界场景。

3. 修复 Level 常量定义

改用显式值定义,确保与 slog.Level 完全对齐:

  • DebugLevel = -4
  • InfoLevel = 0
  • WarnLevel = 4
  • ErrorLevel = 8
  • FatalLevel = 12

4. 统一错误字段设计

使用 err_msg 作为错误消息字段名,避免与 slog 标准 msg 字段冲突。

5. 代码质量提升

  • 文件重命名:slog_handler.gohandler.go
  • 新增设计文档:clog/Blog.md
  • 完善示例代码:新增预设字段和动态级别演示

测试计划

  • 所有现有测试通过
  • 新增回归测试覆盖 With 字段污染场景
  • 手动验证示例代码输出

Breaking Changes

  • WithStandardContext() 已移除,需改用 WithContextField() 组合

🤖 Generated with Claude Code

ceyewan and others added 2 commits January 27, 2026 14:55
- 统一错误字段名为 "error",使用常量定义字段键
- 修复 Error 系列函数的 nil 处理,返回 slog.Attr{} 而非空字段
- 添加 Uint64 和 Group 字段构造函数
- 改进 getStackTrace 实现,过滤 runtime.main 和 runtime.goexit
- 清理冗余注释,保持代码简洁
- 更新 README.md 文档,反映最新 API 变更

Breaking changes:
- Error 字段名从 "err_msg" 改为 "msg"(在 error group 中)
- nil 错误不再记录任何字段(之前会记录空字段或 code)
- 移除 WithStandardContext,改用更灵活的 WithContextField
- 修复 Level 常量定义,使用显式值替代 iota
- 修复 With 方法字段污染 bug,避免派生 Logger 之间共享底层数组
- 统一错误字段命名,使用 err_msg 避免与标准 msg 冲突
- 重构 Handler 文件结构,slog_handler.go 重命名为 handler.go
- 完善示例代码,添加预设字段和动态级别演示
- 添加回归测试 TestLoggerWith_DerivedLoggerDoesNotMutateSiblings

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@ceyewan ceyewan merged commit e902fd2 into main Jan 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant