2. Zapcore

Zapcore 是 Zap 日志库的核心组件,提供构建和自定义日志系统的底层接口和类型。

1 编码器

​类别​

​函数名称​

​用途​

​描述​

​时间编码器​

EpochMillisTimeEncoder

机器处理、日志聚合系统

时间戳以毫秒为单位(如 1700000000000

EpochNanosTimeEncoder

高精度性能分析、分布式追踪

时间戳以纳秒为单位(如 1700000000000000000

EpochTimeEncoder

兼容旧系统、简单时间戳需求

时间戳以秒为单位(如 1700000000

ISO8601TimeEncoder

人类可读、跨时区日志分析

ISO8601 格式(如 2023-11-15T09:30:00Z

RFC3339TimeEncoder

严格时间格式兼容性需求

RFC3339 格式(等同于 ISO8601 严格模式)

RFC3339NanoTimeEncoder

高精度时间戳、微服务链路追踪

RFC3339 格式含纳秒(如 2023-11-15T09:30:00.123456Z

​日志级别编码器​

CapitalLevelEncoder

结构化日志(如 JSON)、机器处理

大写级别(如 INFO

CapitalColorLevelEncoder

终端输出、开发环境调试

大写级别带 ANSI 颜色(如 \033[32mINFO\033[0m

LowercaseLevelEncoder

兼容小写日志系统(如 ELK)

小写级别(如 info

LowercaseColorLevelEncoder

终端输出颜色统一(小写风格)

小写级别带 ANSI 颜色

​调用者信息编码器​

FullCallerEncoder

调试阶段详细追踪代码路径

完整调用路径(如 /src/project/main.go:42

ShortCallerEncoder

生产环境简洁日志、减少存储开销

短调用路径(如 main.go:42

​持续时间编码器​

MillisDurationEncoder

监控系统(Prometheus)、性能统计

持续时间以毫秒为单位(如 1500

NanosDurationEncoder

低延迟系统、纳秒级性能分析

持续时间以纳秒为单位(如 1500000000

SecondsDurationEncoder

粗略时间统计、简单日志记录

持续时间以秒为单位(如 1.5

StringDurationEncoder

人类可读日志、开发调试

可读字符串(如 1.5s

​日志器名称编码器​

FullNameEncoder

微服务/模块化日志追踪、区分日志源

完整日志器名称(如 app.module.submodule

2 类型

2.1 Core接口

Core 是 Zap 日志库的核心接口,定义了日志处理的基本逻辑。

方法​

​作用​

With([]Field) Core

添加结构化字段到 Core,返回新的 Core(链式调用)。

Check(Entry, *CheckedEntry) *CheckedEntry

判断是否记录日志,若需记录,将自身添加到 CheckedEntry

Write(Entry, []Field) error

序列化并写入日志条目及字段。

Sync() error

同步缓冲区数据到存储(如刷新文件到磁盘)。

2.1.1 NewCore(enc Encoder, ws WriteSyncer, enab LevelEnabler) Core​​

​作用​​:创建基础 Core,将日志写入指定目标。 ​​参数​​:

  • enc Encoder:日志编码器(如 JSON、Console)。

  • ws WriteSyncer:日志输出目标(文件、标准输出等)。

  • enab LevelEnabler:日志级别过滤器(如 zap.InfoLevel)。

​示例​​:

2.1.2 NewIncreaseLevelCore(core Core, level LevelEnabler) (Core, error)​​

​作用​​:提升现有 Core 的日志级别(只能提升,不能降低)。 ​​注意​​:若 level 低于原 Core 的级别,返回错误。

​示例​​:

2.1.3 NewLazyWith(core Core, fields []Field) Core​​

​作用​​:延迟字段的编码,仅在日志实际写入时处理字段。 ​​适用场景​​:字段值计算开销大时优化性能。

​示例​​:

2.1.4 NewNopCore() Core​​

​作用​​:创建无操作的 Core,禁用所有日志记录。 ​​适用场景​​:测试或需要完全关闭日志时使用。

​示例​​:

2.1.5 NewSamplerWithOptions(core Core, tick time.Duration, first, thereafter int, opts ...SamplerOption) Core​​

​作用​​:创建带采样策略的 Core,控制日志量。 ​​参数​​:

  • tick:采样时间窗口(如 time.Second)。

  • first:每个窗口内首次记录的日志条数。

  • thereafter:后续每记录 thereafter 条日志保留 1 条。

​示例​​:

2.1.6 NewTee(cores ...Core) Core​​

​作用​​:组合多个 Core,日志同时写入多个目标。 ​​示例​​:

2.1.7 RegisterHooks(core Core, hooks ...func(Entry) error) Core​​

​作用​​:注册钩子函数,在日志写入前后执行自定义逻辑(如统计、告警)。

​示例​​:

2.1.8 示例

将日志同时输出到文件(Info+)和远程服务(Error+),并采样高频日志。

2.2 Entry类型

Entry 表示一个完整的日志条目,包含日志的基本信息和上下文。

  • 池化(Pooled)机制​​: Entry 实例通过对象池管理,以提升性能。​​处理完日志后必须释放引用​​,否则可能导致内存泄漏或数据竞争。

  • ​字段特性​​:

    • LoggerName, Caller, Stack 为可选字段,留空时在编码时会被忽略。

    • CallerStack 需通过 Logger 配置启用(如 AddCaller(), AddStacktrace())。

2.3 Encoder接口

Encoder 是 Zap 的日志编码器接口,负责将日志条目和字段序列化为特定格式(如 JSON、控制台)。

​方法​

​作用​

Clone() Encoder

创建编码器的副本,避免修改原实例。

EncodeEntry(Entry, []Field) (*buffer.Buffer, error)

序列化日志条目和字段到字节缓冲区,返回结果。

2.3.1 NewConsoleEncoder(cfg EncoderConfig) Encoder​​

​作用​​:创建面向人类阅读的控制台编码器,核心数据以纯文本格式输出,结构化字段以 JSON 显示。 ​​参数​​:

  • cfg EncoderConfig:编码器配置(时间格式、字段键名等)。

​示例配置​​:

2.3.2 NewJSONEncoder(cfg EncoderConfig) Encoder

作用​​:创建高效 JSON 编码器,所有字段以 JSON 格式输出。 ​​参数​​:

  • cfg EncoderConfig:同上,但需注意键名配置。

​示例配置​​:

2.3.3 示例

分别使用 JSON 和控制台编码器记录日志。

EncoderConfig类型

2.4 WriteSyncer接口

WriteSyncer 是 Zap 中定义的一个接口,结合了 io.WriterSync() 方法,用于写入日志数据并同步缓冲区。

2.4.1 AddSync(w io.Writer) WriteSyncer​​

​作用​​:将任意 io.Writer 转换为 WriteSyncer。若 w 已实现 Sync(),则直接使用;否则添加空操作 Sync()。 ​​适用场景​​:适配非 WriteSyncer 的写入目标(如网络流、缓冲区)。

​示例​​:

2.4.2 ​​Lock(ws WriteSyncer) WriteSyncer​​

​作用​​:用互斥锁包装 WriteSyncer,实现并发安全写入。 ​​适用场景​​:多 Goroutine 共享同一写入目标(如文件、标准输出)。

​示例​​:

2.4.3 ​​NewMultiWriteSyncer(ws ...WriteSyncer) WriteSyncer​​

​作用​​:将日志同时写入多个目标(类似 io.MultiWriter)。 ​​适用场景​​:日志多路输出(如文件 + 控制台 + 远程服务)。

​示例​​:

2.4.4 示例

并发安全地写入文件,并同时输出到控制台和远程服务。

2.5 Level类型

Level 表示日志的优先级级别,值越高表示越重要。

​级别​

​值​

​说明​

DebugLevel

-1

调试信息,通常在生产环境中关闭。

InfoLevel

0

常规信息,默认日志级别。

WarnLevel

1

警告信息,需关注但无需立即处理。

ErrorLevel

2

错误信息,应用程序仍可运行但需排查。

DPanicLevel

3

严重错误,开发环境下会触发 panic。

PanicLevel

4

记录日志后触发 panic。

FatalLevel

5

记录日志后调用 os.Exit(1) 终止程序。

InvalidLevel

6

无效级别,用于错误处理。

2.5.1 LevelOf(enab LevelEnabler) Level​​

​作用​​:获取 LevelEnabler(如 Core)的最低启用级别。 ​​参数​​:enab LevelEnabler(需实现 Level() Level 方法)。 ​​返回​​:启用的最低级别或 InvalidLevel。 ​​示例​​:

2.5.2 ​​ParseLevel(text string) (Level, error)​​

​作用​​:将字符串解析为 Level(不区分大小写)。 ​​示例​​:

2.5.3 ​​(l Level) CapitalString() string​​

​作用​​:返回级别的大写字符串(如 "INFO", "ERROR")。 ​​示例​​:

2.5.4 ​​(l Level) Enabled(lvl Level) bool​​

​作用​​:检查给定级别是否高于或等于当前级别。 ​​示例​​:

2.5.5 ​​(l *Level) Get() interface{}​​

​作用​​:实现 flag.Getter 接口,用于命令行参数解析。 ​​示例​​:

2.5.6 ​​(l *Level) Set(s string) error​​

​作用​​:实现 flag.Value 接口,从字符串设置级别。 ​​示例​​:

2.5.7 ​(l Level) String() string​​

​作用​​:返回级别的小写字符串(如 "info", "error")。 ​​示例​​:

2.5.8 ​​(l *Level) UnmarshalText(text []byte) error​​

​作用​​:从文本反序列化级别(用于配置文件解析)。 ​​示例​​:

最后更新于