如何配置Golang使用Uber Zap记录包含错误堆栈的Go结构化日志?

2026-05-07 01:540阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计961个文字,预计阅读时间需要4分钟。

如何配置Golang使用Uber Zap记录包含错误堆栈的Go结构化日志?

由于+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分钟。

如何配置Golang使用Uber Zap记录包含错误堆栈的Go结构化日志?

由于+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() 类型适配器。

阅读全文