1. Logger

1.1.1. 介绍

在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能:

  • 能够将事件记录到文件中,而不是应用程序控制台。
  • 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。
  • 支持不同的日志级别。例如INFO,DEBUG,ERROR等。
  • 能够打印基本信息,如调用文件/函数名和行号,日志时间等。

1.1.2. 默认的Go Logger

在介绍Uber-go的zap包之前,让我们先看看Go语言提供的基本日志功能。Go语言提供的默认日志包是 https://golang.org/pkg/log/

1.1.3. 实现Go Logger

实现一个Go语言中的日志记录器非常简单——创建一个新的日志文件,然后设置它为日志的输出位置。

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. )
  8. func main() {
  9. //创建输出日志文件
  10. logFile, err := os.Create("./" + time.Now().Format("20060102") + ".txt")
  11. if err != nil {
  12. fmt.Println(err)
  13. }
  14. //创建一个Logger
  15. //参数1:日志写入目的地
  16. //参数2:每条日志的前缀
  17. //参数3:日志属性
  18. loger := log.New(logFile, "test_", log.Ldate|log.Ltime|log.Lshortfile)
  19. //Flags返回Logger的输出选项
  20. fmt.Println(loger.Flags())
  21. //SetFlags设置输出选项
  22. loger.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
  23. //返回输出前缀
  24. fmt.Println(loger.Prefix())
  25. //设置输出前缀
  26. loger.SetPrefix("test_")
  27. //输出一条日志
  28. loger.Output(2, "打印一条日志信息")
  29. //格式化输出日志
  30. // loger.Printf("第%d行 内容:%s", 11, "我是错误")
  31. //等价于print();os.Exit(1);
  32. // loger.Fatal("我是错误")
  33. //等价于print();panic();
  34. // loger.Panic("我是错误33333333")
  35. //log的导出函数
  36. //导出函数基于std,std是标准错误输出
  37. //var std = New(os.Stderr, "", LstdFlags)
  38. //获取输出项
  39. fmt.Println(log.Flags())
  40. //获取前缀
  41. fmt.Printf(log.Prefix())
  42. }

1.1.4. Go Logger的优势和劣势

优势

它最大的优点是使用非常简单。我们可以设置任何io.Writer作为日志记录输出并向其发送要写入的日志。

劣势

  • 仅限基本的日志级别
    • 只有一个Print选项。不支持INFO/DEBUG等多个级别。
  • 对于错误日志,它有Fatal和Panic
    • Fatal日志通过调用os.Exit(1)来结束程序
    • Panic日志在写入日志消息之后抛出一个panic
    • 但是它缺少一个ERROR日志级别,这个级别可以在不抛出panic或退出程序的情况下记录错误
  • 缺乏日志格式化的能力——例如记录调用者的函数名和行号,格式化日期和时间格式。等等。
  • 不提供日志切割的能力。