日志管理 | 青训营大项目笔记

79 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

日志对于程序的开发至关重要,通过日志记录的问题发生位置,能够更为高效的解决在开发和测试中遇到的问题。

作为 日志记录器 需要提供以下的功能:

  • 支持把日志写入到多个输出流中,比如可以选择性的让测试、开发环境同时向控制台和日志文件输出日志,生产环境只输出到文件中。
  • 支持多级别的日志等级,比如常见的有:TRACEDEBUGINFOWARNERROR 等。
  • 支持结构化输出,结构化输出现在常用的就是JSON形式的,这样可以让统一日志平台,通过 logstash 之类的组件直接把日志聚合到日志平台上去。
  • 需要支持日志切割 -- log rotation, 按照日期、时间间隔或者文件大小对日志进行切割。
  • 在 Log Entry 中(就是每行记录)除了主动记录的信息外,还要包括如打印日志的函数、所在的文件、行号、记录时间等。

Go 的内置 Logger

golang.org/pkg/log/

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