如何配置Golang使用Uber Zap记录包含错误堆栈的Go结构化日志?
- 内容介绍
- 文章标签
- 相关推荐
本文共计961个文字,预计阅读时间需要4分钟。
由于+zap.Error()默认只序列化+error.Error()字符串,不调用+fmt.Printf(),直接输出结果如下:
- 如果你用的是
errors.New()或fmt.Errorf()(无%w),那确实没堆栈 - 即使用了
github.com/pkg/errors或 Go 1.13+ 的fmt.Errorf("...: %w", err),Zap 仍不会自动展开Unwrap()链并打印所有帧 - 常见现象:
logger.Error("failed to process", zap.Error(err))日志里只看到"failed to process: context canceled",完全没行号、文件、调用链
怎么让 Zap 打出完整堆栈?
核心思路:把带堆栈的错误对象(比如 github.com/pkg/errors.WithStack() 或 errors.Join() 后再包装)转成字符串,再用 zap.String() 记录;或者直接用 Zap 提供的 zap.Stringer() 类型适配器。
本文共计961个文字,预计阅读时间需要4分钟。
由于+zap.Error()默认只序列化+error.Error()字符串,不调用+fmt.Printf(),直接输出结果如下:
- 如果你用的是
errors.New()或fmt.Errorf()(无%w),那确实没堆栈 - 即使用了
github.com/pkg/errors或 Go 1.13+ 的fmt.Errorf("...: %w", err),Zap 仍不会自动展开Unwrap()链并打印所有帧 - 常见现象:
logger.Error("failed to process", zap.Error(err))日志里只看到"failed to process: context canceled",完全没行号、文件、调用链
怎么让 Zap 打出完整堆栈?
核心思路:把带堆栈的错误对象(比如 github.com/pkg/errors.WithStack() 或 errors.Join() 后再包装)转成字符串,再用 zap.String() 记录;或者直接用 Zap 提供的 zap.Stringer() 类型适配器。

