本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档。
在Go语言项目中使用Zap日志库
介绍
在许多 Go 语言项目中,我们需要一个好的日志记录器能够提供下面这些功能:
1、能够将事件记录到文件中,也可以在应用控制台输出
2、日志切割-可以根据文件大小,时间或间隔来切割日志文件
3、支持不同的日志级别。例如 INFO、DEBUG、ERROR等
4、能够打印基本信息,如调用文件/函数名和行号,日志时间等。
默认的 Go Logger
实现 Go logger
1、实现一个 Go 语言中日志记录器非常简单,----创建一个新的日志文件,然后设置日志输出的位置
设置 logger
我们可以像下面代码一样设置日志记录器
使用Logger
test.log
Go Logger的优势和劣势
优势
io.Writer
SugaredLogger
LoggerSugaredLogger
Logger
zap.NewProduction()zap.NewDevelopment()zap.Example()
在上面的代码中,我们首先创建了一个Logger,然后使用Info/ Error等Logger方法记录消息。
日志记录器方法的语法是这样的:
MethodXXXzapcore.Field
zapcore.Field
我们执行上面的代码会得到如下输出结果:
Sugared Logger
现在让我们使用Sugared Logger来实现相同的功能。
. Sugar()SugaredLoggerSugaredLoggerprintf
SugaredLoggerLogger
当你执行上面的代码会得到如下输出:
在本博客的后面部分,我们将更详细地讨论SugaredLogger,并了解如何进一步配置它。
定制logger
将日志写入文件而不是终端
我们要做的第一个更改是把日志写入文件,而不是打印到应用程序控制台。
zap.New(…)zap.NewProduction()
zapcore.CoreEncoderWriteSyncerLogLevel
NewJSONEncoder()ProductionEncoderConfig()
zapcore.AddSync()
3.Log Level:哪种级别的日志将被写入。
输出结果
将JSON Encoder更改为普通的Log Encoder
NewJSONEncoder()NewConsoleEncoder()
完整代码
更改时间编码并添加调用者详细信息
鉴于我们对配置所做的更改,有下面两个问题:
- 时间是以非人类可读的方式展示,例如1.572161051846623e+09
- 调用方函数的详细信息没有显示在日志中
ProductionConfig()
- 修改时间编码器
- 在日志文件中使用大写字母记录日志级别
完整代码
zap.New(..)Option
完整代码
将日志输出到多个位置
我们可以将日志同时输出到文件和终端
完整代码
将err日志单独输出到文件
xx.logERRORxx.err.log
完整代码
将err日志单独输出到文件 + 控制台输出