Go 中的快速、结构化、分级日志记录。
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 ),
)
有关更多详细信息,请参阅文档和常见问题解答。
对于登录热路径的应用程序,基于反射的序列化和字符串格式化的成本非常高——它们是 CPU 密集型的,并且会进行许多小的分配。换句话说,使用encoding/json
和fmt.Fprintf
记录大量的interface{}
会使你的应用程序变慢。
Zap 采用了不同的方法。它包括一个无反射、零分配的 JSON 编码器,并且基本Logger
致力于尽可能避免序列化开销和分配。通过在此基础上构建高级SugaredLogger
,zap 允许用户选择何时需要计算每个分配以及何时更喜欢更熟悉的松散类型 API。
根据其自己的基准测试套件的测量,zap 不仅比同类结构化日志记录包性能更高,而且比标准库更快。与所有基准一样,请对这些持保留态度。 1
记录一条消息和 10 个字段:
包裹 | 时间 | 切换时间% | 分配的对象 |
---|---|---|---|
⚡ 扎普 | 656 纳秒/操作 | +0% | 5 个分配/操作 |
⚡ zap(加糖) | 935 纳秒/操作 | +43% | 10 个分配/操作 |
零日志 | 380 纳秒/操作 | -42% | 1 个分配/操作 |
去套件 | 2249 纳秒/操作 | +243% | 57 个分配/操作 |
slog(LogAttrs) | 2479 纳秒/操作 | +278% | 40 个分配/操作 |
艰苦 | 2481 纳秒/操作 | +278% | 42 个分配/操作 |
顶点/对数 | 9591 纳秒/操作 | +1362% | 63 个分配/操作 |
日志15 | 11393 纳秒/操作 | +1637% | 75 个分配/操作 |
洛鲁斯 | 11654 纳秒/操作 | +1677% | 79 个分配/操作 |
使用已有 10 个上下文字段的记录器记录消息:
包裹 | 时间 | 切换时间% | 分配的对象 |
---|---|---|---|
⚡ 扎普 | 67 纳秒/操作 | +0% | 0 分配/操作 |
⚡ zap(加糖) | 84 纳秒/操作 | +25% | 1 个分配/操作 |
零日志 | 35 纳秒/操作 | -48% | 0 分配/操作 |
艰苦 | 193 纳秒/操作 | +188% | 0 分配/操作 |
slog(LogAttrs) | 200 纳秒/操作 | +199% | 0 分配/操作 |
去套件 | 2460 纳秒/操作 | +3572% | 56 个分配/操作 |
日志15 | 9038 纳秒/操作 | +13390% | 70 个分配/操作 |
顶点/对数 | 9068 纳秒/操作 | +13434% | 53 个分配/操作 |
洛鲁斯 | 10521 纳秒/操作 | +15603% | 68 个分配/操作 |
记录静态字符串,没有任何上下文或printf
样式模板:
包裹 | 时间 | 切换时间% | 分配的对象 |
---|---|---|---|
⚡ 扎普 | 63 纳秒/操作 | +0% | 0 分配/操作 |
⚡ zap(加糖) | 81 纳秒/操作 | +29% | 1 个分配/操作 |
零日志 | 32 纳秒/操作 | -49% | 0 分配/操作 |
标准库 | 124 纳秒/操作 | +97% | 1 个分配/操作 |
艰苦 | 196 纳秒/操作 | +211% | 0 分配/操作 |
slog(LogAttrs) | 200 纳秒/操作 | +217% | 0 分配/操作 |
去套件 | 213 纳秒/操作 | +238% | 9 个分配/操作 |
顶点/对数 | 771 纳秒/操作 | +1124% | 5 个分配/操作 |
洛鲁斯 | 1439 纳秒/操作 | +2184% | 23 个分配/操作 |
日志15 | 2069 纳秒/操作 | +3184% | 20 个分配/操作 |
所有 API 均已最终确定,并且 1.x 系列版本中不会进行任何重大更改。支持 semver 的依赖管理系统的用户应将 zap 固定到^1
。
我们鼓励并支持一个活跃、健康的贡献者社区——包括您!详细信息请参阅贡献指南和行为准则。 zap 维护人员会密切关注问题和拉取请求,但您也可以向 [email protected] 报告任何负面行为。该电子邮件列表是一个私密、安全的空间;即使是 zap 维护者也无权访问,所以请毫不犹豫地要求我们遵守高标准。
根据 MIT 许可证发布。
1特别请记住,我们可能会针对其他软件包的稍旧版本进行基准测试。版本固定在 benchmarks/go.mod 文件中。 ↩