初识Go第三方日志库zap

309 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26天,点击查看活动详情

前言

标准库log包功能有限,不能满足日志级别的指定(info|warn|error等)、日志格式化操作,以及日志文件切割等能力。在实际项目开发中,会选择使用第三方日志库zap来做支持。

log包回顾

设置日志文件路径、简单日志格式、日志前缀。然后可使用Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、Panic系列(Panic|Panicf|Panicln)等相关函数,进行日志的打印输出。

代码示例:

func init() {
  //设置日志文件
  file, err := os.OpenFile("./07_package/09_logtest1.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0655)
  if err != nil {
    fmt.Println("os.OpenFile err:", err)
    return
  }
  //defer file.Close()
  log.SetOutput(file)
}

func main() {
  log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds | log.Lshortfile)
  log.SetPrefix("[logger]")
  log.Println("logger first see")
  log.Fatal("logger first fatal")
}

日志输出:

[logger]2023/02/27 22:21:26.229873 09_log.go:25: logger first see
[logger]2023/02/27 22:21:26.230026 09_log.go:26: logger first fatal

Zap初识

Zap是非常快的、结构化的,分日志级别的Go日志库

安装:go get -u https://github.com/uber-go/zap

Zap提供了两种类型的日志记录器LoggerSugared Logger

  • 在性能很好但不是很关键的上下文中,使用SugaredLogger。它比其他结构化日志记录包快4-10倍,并且支持结构化和printf风格的日志记录。
  • 在每一微秒和每一次内存分配都很重要的上下文中,使用Logger。它甚至比SugaredLogger更快,内存分配次数也更少,但它只支持强类型的结构化日志记录。

Logger

  • 通过调用zap.NewProduction()/zap.NewDevelopment()或者zap.Example()创建一个Logger。
  • 上面的每一个函数都将创建一个logger。唯一的区别在于它将记录的信息不同。例如production logger默认记录调用函数信息、日期和时间等。
  • 通过Logger调用Info/Error等。
  • 默认情况下日志都会打印到应用程序的console界面。

代码示例:

var logger *zap.Logger

func main() {
  logger, _ = zap.NewProduction()
  defer logger.Sync()

  url := "http://www.baidu.com"
  resp, err := http.Get(url)
  if err != nil {
    logger.Error("Error fetching url..", zap.String("url", url), zap.Error(err))
  } else {
    logger.Info("Success..", zap.String("statusCode", resp.Status), zap.String("url", url))
    resp.Body.Close()
  }
}

输出日志:

{"level":"info","ts":1677511583.702923,"caller":"07_package/10_zap.go:43","msg":"Success..","statusCode":"200 OK","url":"http://www.baidu.com"}

Sugared Logger

使用Sugared Logger来实现相同的功能

  • 大部分的实现基本都相同。
  • 唯一的区别是,我们通过调用主logger的. Sugar()方法来获取一个SugaredLogger
  • 然后使用SugaredLoggerprintf格式记录语句

代码示例:

var sugarLogger *zap.SugaredLogger

func main() {
  logger, _ = zap.NewProduction()
  sugarLogger = logger.Sugar()
  defer sugarLogger.Sync()

  url := "http://www.baidu.com"
  resp, err := http.Get(url)
  if err != nil {
    sugarLogger.Error("Error fetching url..", zap.String("url", url), zap.Error(err))
  } else {
    sugarLogger.Info("Success..", zap.String("statusCode", resp.Status), zap.String("url", url))
    resp.Body.Close()
  }
}

输出日志:

{"level":"info","ts":1677511583.743777,"caller":"07_package/10_zap.go:29","msg":"Success..{statusCode 15 0 200 OK <nil>} {url 15 0 http://www.baidu.com <nil>}"}

如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!