uber-go/zap

GitHub: uber-go/zap

Uber 开源的 Go 语言高性能日志库,通过无反射、零分配技术提供极快的结构化分级日志记录能力。

Stars: 24442 | Forks: 1509

# :zap: zap
Go 语言中极快、结构化、分级的日志记录库。 ![Zap logo](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b0a7aa2ec4192015.png) [![GoDoc](https://pkg.go.dev/badge/go.uber.org/zap)][doc] [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/4b29d08b4a192016.svg)][ci] [![Coverage Status](https://codecov.io/gh/uber-go/zap/branch/master/graph/badge.svg)][cov]
## 安装 `go get -u go.uber.org/zap` 请注意,zap 仅支持 Go 的两个最新的次要版本。 ## 快速开始 在性能不错但非关键的场景下,使用 `SugaredLogger`。它比其他结构化日志包快 4-10 倍,并且同时支持结构化和 `printf` 风格的 API。 ``` logger, _ := zap.NewProduction() defer logger.Sync() // flushes buffer, if any sugar := logger.Sugar() sugar.Infow("failed to fetch URL", // Structured context as loosely typed key-value pairs. "url", url, "attempt", 3, "backoff", time.Second, ) sugar.Infof("Failed to fetch URL: %s", url) ``` 当性能和类型安全至关重要时,请使用 `Logger`。它比 `SugaredLogger` 更快,且内存分配更少,但它仅支持结构化日志记录。 ``` logger, _ := zap.NewProduction() defer logger.Sync() logger.Info("failed to fetch URL", // Structured context as strongly typed Field values. zap.String("url", url), zap.Int("attempt", 3), zap.Duration("backoff", time.Second), ) ``` 有关更多详细信息,请参阅 [文档][doc] 和 [FAQ](FAQ.md)。 ## 性能 对于在热路径(hot path)中记录日志的应用程序,基于反射的序列化和字符串格式化的代价极其高昂 — 它们不仅占用大量 CPU,还会导致许多小对象的内存分配。换句话说,使用 `encoding/json` 和 `fmt.Fprintf` 来记录大量的 `interface{}` 会使你的应用程序变慢。 Zap 采用了不同的方法。它包含一个无反射、零分配的 JSON 编码器,基础的 `Logger` 尽可能在任何地方避免序列化开销和内存分配。通过在此基础之上构建高级的 `SugaredLogger`,zap 让用户可以*选择*何时需要精打细算每一个内存分配,何时更愿意使用更熟悉、松散类型的 API。 根据其自身的 [基准测试套件][benchmarking suite] 测量,zap 不仅比类似的结构化日志包性能更高 — 它甚至比标准库更快。像所有基准测试一样,请对这些结果持保留态度。[1](#footnote-versions) 记录一条消息和 10 个字段: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | | :zap: zap | 656 ns/op | +0% | 5 allocs/op | :zap: zap (sugared) | 935 ns/op | +43% | 10 allocs/op | zerolog | 380 ns/op | -42% | 1 allocs/op | go-kit | 2249 ns/op | +243% | 57 allocs/op | slog (LogAttrs) | 2479 ns/op | +278% | 40 allocs/op | slog | 2481 ns/op | +278% | 42 allocs/op | apex/log | 9591 ns/op | +1362% | 63 allocs/op | log15 | 11393 ns/op | +1637% | 75 allocs/op | logrus | 11654 ns/op | +1677% | 79 allocs/op 使用已经包含 10 个上下文字段的 logger 记录一条消息: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | | :zap: zap | 67 ns/op | +0% | 0 allocs/op | :zap: zap (sugared) | 84 ns/op | +25% | 1 allocs/op | zerolog | 35 ns/op | -48% | 0 allocs/op | slog | 193 ns/op | +188% | 0 allocs/op | slog (LogAttrs) | 200 ns/op | +199% | 0 allocs/op | go-kit | 2460 ns/op | +3572% | 56 allocs/op | log15 | 9038 ns/op | +13390% | 70 allocs/op | apex/log | 9068 ns/op | +13434% | 53 allocs/op | logrus | 10521 ns/op | +15603% | 68 allocs/op 记录一个静态字符串,不包含任何上下文或 `printf` 风格的模板: | Package | Time | Time % to zap | Objects Allocated | | :------ | :--: | :-----------: | :---------------: | | :zap: zap | 63 ns/op | +0% | 0 allocs/op | :zap: zap (sugared) | 81 ns/op | +29% | 1 allocs/op | zerolog | 32 ns/op | -49% | 0 allocs/op | standard library | 124 ns/op | +97% | 1 allocs/op | slog | 196 ns/op | +211% | 0 allocs/op | slog (LogAttrs) | 200 ns/op | +217% | 0 allocs/op | go-kit | 213 ns/op | +238% | 9 allocs/op | apex/log | 771 ns/op | +1124% | 5 allocs/op | logrus | 1439 ns/op | +2184% | 23 allocs/op | log15 | 2069 ns/op | +3184% | 20 allocs/op ## 开发状态:稳定 所有 API 均已定稿,在 1.x 系列版本中不会进行破坏性更改。使用支持 semver 的依赖管理系统的用户应将 zap 版本锁定为 `^1`。
标签:ETW劫持, Go语言, Homebrew安装, JSON编码器, Uber, Zap, 后端开发, 开发组件, 日志审计, 日志库, 日志记录, 程序破解, 结构化日志, 观察性, 诊断工具, 错误处理, 零分配