uber-go/zap
GitHub: uber-go/zap
Uber 开源的 Go 语言高性能日志库,通过无反射、零分配技术提供极快的结构化分级日志记录能力。
Stars: 24442 | Forks: 1509
# :zap: zap
Go 语言中极快、结构化、分级的日志记录库。

[][doc] [][ci] [][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, 后端开发, 开发组件, 日志审计, 日志库, 日志记录, 程序破解, 结构化日志, 观察性, 诊断工具, 错误处理, 零分配