这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
日志对于程序的开发至关重要,通过日志记录的问题发生位置,能够更为高效的解决在开发和测试中遇到的问题。
作为 日志记录器 需要提供以下的功能:
- 支持把日志写入到多个输出流中,比如可以选择性的让测试、开发环境同时向控制台和日志文件输出日志,生产环境只输出到文件中。
- 支持多级别的日志等级,比如常见的有:
TRACE,DEBUG,INFO,WARN,ERROR等。 - 支持结构化输出,结构化输出现在常用的就是
JSON形式的,这样可以让统一日志平台,通过 logstash 之类的组件直接把日志聚合到日志平台上去。 - 需要支持日志切割 --
log rotation, 按照日期、时间间隔或者文件大小对日志进行切割。 - 在 Log Entry 中(就是每行记录)除了主动记录的信息外,还要包括如打印日志的函数、所在的文件、行号、记录时间等。
Go 的内置 Logger
Go 的内置 Logger,使用 log 记录日志,默认会输出到控制台中 - log.Printf()
也支持把日志输出到文件中,通过 log.SetOutput 的设置,可以把任何 io.Writer 的实现设置成日志的输出
虽然内置的 logger 非常易用,但是功能还是比较匮乏。
- 仅支持基本的日志级别 只有
Print选项,不支持INFO/DEBUG - 缺乏结构化日志格式的能力,只支持简单文本输出,不能把日志记录格式化成
JSON格式
zap 的使用
log 的实例化
// NewExample 函数里面展示了要通过 NewCore 来创建一个 Core 结构体
log := zap.NewExample()
使用 NewCore 创建 Core 结构体的时候,需要传入的三个参数:
- 输入数据的编码器 Encoder
- 日志数据的目的地 WriteSyncer
- 以及日志级别 LevelEnabler
通过定义 zapcore.Core,可以实现对日志文件的自定义
zap 的安装
go get -u go.uber.org/zap