Zap 使用一个无反射、零分配的 JOSN 编码器,基础 Logger 尽可能避免序列化开销和内存分配开销

zap 特性

  • 高性能:zap 对日志输出进行了多项优化以提高它的性能
  • 日志分级:有 Debug,Info,Warn,Error,DPanic,Panic,Fatal 等
  • 日志记录结构化:日志内容记录是结构化的,比如 json 格式输出
  • 自定义格式:用户可以自定义输出的日志格式
  • 自定义公共字段:用户可以自定义公共字段,大家输出的日志内容就共同拥有了这些字段
  • 调试:可以打印文件名、函数名、行号、日志时间等,便于调试程序
  • 自定义调用栈级别:可以根据日志级别输出它的调用栈信息
  • Namespace:日志命名空间。定义命名空间后,所有日志内容就在这个命名空间下。命名空间相当于一个文件夹
  • 支持 hook 操作

性能对比

压测报告

Log a message and 10 fields:

PackageTimeTime % to zapObjects Allocated
⚡ zap656 ns/op+0%5 allocs/op
⚡ zap (sugared)935 ns/op+43%10 allocs/op
zerolog380 ns/op-42%1 allocs/op
go-kit2249 ns/op+243%57 allocs/op
slog (LogAttrs)2479 ns/op+278%40 allocs/op
slog2481 ns/op+278%42 allocs/op
apex/log9591 ns/op+1362%63 allocs/op
log1511393 ns/op+1637%75 allocs/op
logrus11654 ns/op+1677%79 allocs/op

Log a message with a logger that already has 10 fields of context:

PackageTimeTime % to zapObjects Allocated
⚡ zap67 ns/op+0%0 allocs/op
⚡ zap (sugared)84 ns/op+25%1 allocs/op
zerolog35 ns/op-48%0 allocs/op
slog193 ns/op+188%0 allocs/op
slog (LogAttrs)200 ns/op+199%0 allocs/op
go-kit2460 ns/op+3572%56 allocs/op
log159038 ns/op+13390%70 allocs/op
apex/log9068 ns/op+13434%53 allocs/op
logrus10521 ns/op+15603%68 allocs/op

Log a static string, without any context or printf-style templating:

PackageTimeTime % to zapObjects Allocated
⚡ zap63 ns/op+0%0 allocs/op
⚡ zap (sugared)81 ns/op+29%1 allocs/op
zerolog32 ns/op-49%0 allocs/op
standard library124 ns/op+97%1 allocs/op
slog196 ns/op+211%0 allocs/op
slog (LogAttrs)200 ns/op+217%0 allocs/op
go-kit213 ns/op+238%9 allocs/op
apex/log771 ns/op+1124%5 allocs/op
logrus1439 ns/op+2184%23 allocs/op
log152069 ns/op+3184%20 allocs/op

日志级别

go.uber.org/**zap@v1.27.0/level.go**

 1const (
 2	// Debug 应是大量的,且通常在生产状态禁用.
 3	DebugLevel = zapcore.DebugLevel
 4	// Info 是默认的记录优先级.
 5	InfoLevel = zapcore.InfoLevel
 6	// Warn 比 info 更重要.
 7	WarnLevel = zapcore.WarnLevel
 8	// Error 是高优先级的,如果程序顺利不应该产生任何 err 级别日志.
 9	ErrorLevel = zapcore.ErrorLevel
10	// DPanic 特别重大的错误,在开发模式下引起 panic. 
11	DPanicLevel = zapcore.DPanicLevel
12	// Panic 记录消息后调用 panic.
13	PanicLevel = zapcore.PanicLevel
14	// Fatal 记录消息后调用 os.Exit(1).
15	FatalLevel = zapcore.FatalLevel
16)