在Go语言项目中使用Zap日志库

本文先介绍了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日志单独输出到文件 + 控制台输出