1. 日志切割归档

1.1.1. 使用Lumberjack进行日志切割归档

这个日志程序中唯一缺少的就是日志切割归档功能。

Zap本身不支持切割归档日志文件

为了添加日志切割归档功能,我们将使用第三方库Lumberjack来实现。

1.1.2. 安装

执行下面的命令安装Lumberjack

  1. go get -u github.com/natefinch/lumberjack

1.1.3. zap logger中加入Lumberjack

要在zap中加入Lumberjack支持,我们需要修改WriteSyncer代码。我们将按照下面的代码修改getLogWriter()函数:

  1. func getLogWriter() zapcore.WriteSyncer {
  2. lumberJackLogger := &lumberjack.Logger{
  3. Filename: "./test.log",
  4. MaxSize: 10,
  5. MaxBackups: 5,
  6. MaxAge: 30,
  7. Compress: false,
  8. }
  9. return zapcore.AddSync(lumberJackLogger)
  10. }

Lumberjack Logger采用以下属性作为输入:

  • Filename: 日志文件的位置
  • MaxSize:在进行切割之前,日志文件的最大大小(以MB为单位)
  • MaxBackups:保留旧文件的最大个数
  • MaxAges:保留旧文件的最大天数
  • Compress:是否压缩/归档旧文件

1.1.4. 测试所有功能

最终,使用Zap/Lumberjack logger的完整示例代码如下:

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/natefinch/lumberjack"
  5. "go.uber.org/zap"
  6. "go.uber.org/zap/zapcore"
  7. )
  8. var sugarLogger *zap.SugaredLogger
  9. func main() {
  10. InitLogger()
  11. defer sugarLogger.Sync()
  12. simpleHttpGet("www.topgoer.com")
  13. simpleHttpGet("http://www.topgoer.com")
  14. }
  15. func InitLogger() {
  16. writeSyncer := getLogWriter()
  17. encoder := getEncoder()
  18. core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
  19. logger := zap.New(core, zap.AddCaller())
  20. sugarLogger = logger.Sugar()
  21. }
  22. func getEncoder() zapcore.Encoder {
  23. encoderConfig := zap.NewProductionEncoderConfig()
  24. encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
  25. encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
  26. return zapcore.NewConsoleEncoder(encoderConfig)
  27. }
  28. func getLogWriter() zapcore.WriteSyncer {
  29. lumberJackLogger := &lumberjack.Logger{
  30. Filename: "./test.log",
  31. MaxSize: 1,
  32. MaxBackups: 5,
  33. MaxAge: 30,
  34. Compress: false,
  35. }
  36. return zapcore.AddSync(lumberJackLogger)
  37. }
  38. func simpleHttpGet(url string) {
  39. sugarLogger.Debugf("Trying to hit GET request for %s", url)
  40. resp, err := http.Get(url)
  41. if err != nil {
  42. sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
  43. } else {
  44. sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
  45. resp.Body.Close()
  46. }
  47. }