如何入门使用Go语言中的Zerolog日志库?

摘要:简介 Zerolog 是一个可以结构化输出 JSON 格式的 Go 日志库,其特点就是高性能,名字中的 zero 代表零分配设计,速度非常快。 什么是零分配设计? 在 Go 语言中,内存分配会带来一定的性能开销,频繁的内存分配和垃圾回收(G
简介 Zerolog 是一个可以结构化输出 JSON 格式的 Go 日志库,其特点就是高性能,名字中的 zero 代表零分配设计,速度非常快。 什么是零分配设计? 在 Go 语言中,内存分配会带来一定的性能开销,频繁的内存分配和垃圾回收(GC)会影响程序性能。零分配设计的目标是在热点代码路径上尽量避免堆内存分配,从而减少 GC 压力,提升整体性能。 Zerolog 通过精心设计的 API 实现了这一目标: 链式调用返回指针而非值:避免了每次调用都创建新的对象 使用 sync.Pool 复用对象:日志事件对象会被放回池中重复利用 避免接口类型:直接使用具体类型,消除接口调用的开销 预分配缓冲区:减少写入时的内存分配 这种设计使得 Zerolog 在高并发场景下表现出色,尤其适合对性能敏感的服务端应用。 有人做了一个 Go 日志库 benchmark: https://betterstack-community.github.io/go-logging-benchmarks/,可以看出 zerolog 相较于其它日志库,性能都是第一档的,不管是执行速度还是内存占用,表现得都非常好。 特点 高性能:零分配设计,极高的写入速度,对 GC 几乎无压力。 结构化日志:默认输出 JSON 格式,便于日志系统(如 ELK、Loki)解析和检索。 支持 context:可以在请求链路中传递和追加日志字段,实现请求级别的日志追踪。 日志采样:对高频日志进行采样,防止日志风暴撑爆磁盘。 Hook 机制:可在日志写入前进行拦截处理,例如发送错误日志到 Sentry。 彩色输出:开发环境下可以启用彩色输出,提升可读性。 安装 go get github.com/rs/zerolog/log 基本使用 Zerolog 开箱即用,无需复杂配置即可快速上手。默认输出到 stderr,日志格式为 JSON,每条日志自动包含 level 和 time 字段。 Zerolog 采用链式调用风格,API 设计简洁直观: log.Info()、log.Warn()、log.Error() 等方法创建对应级别的日志事件 Str()、Int()、Float64() 等方法添加自定义字段 Msg() 或 Msgf() 方法最终输出日志 package main import ( "errors" "github.com/rs/zerolog/log" ) func main() { log.Info().Msg("hello world") log.Warn().Str("key1", "value1").Float64("fnumber", 12.34).Msg("this is a message") err := errors.New("this is an error") log.Error().Err(err).Str("service", "user").Msgf("couldn't start %s", "user") } 运行输出: go run main.go {"level":"info","time":"2026-03-10T20:41:01+08:00","message":"hello world"} {"level":"warn","key1":"value1","fnumber":12.34,"time":"2026-03-10T20:41:01+08:00","message":"this is a message"} {"level":"error","error":"this is an error","service":"user","time":"2026-03-10T20:41:01+08:00","message":"couldn't start user"} 基本配置 可以进行一些基本配置: package main import ( "os" "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) func main() { // 全局设置:设置 time 字段值为 unix 时间戳 zerolog.TimeFieldFormat = zerolog.TimeFormatUnix // 全局设置:设置日志级别 zerolog.SetGlobalLevel(zerolog.DebugLevel) // 输出到 stdout。
阅读全文