Go语言 zap日志系统与gin继承

1,907 阅读2分钟

基本演示

var logger *zap.Logger

func main() {
   initLogger()
   // 在程序退出之前把缓冲区里的文件都刷到硬盘上
   defer logger.Sync()
   httpGet("https://www.baidu.com")
   httpGet("https://www.google.com")
}

func initLogger() {
   // 这里还可以New Develp环境的日志 只是输出格式不太一样
   logger, _ = zap.NewProduction()
}

func httpGet(url string) {
   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()
   }
}

image.png

定制Logger


var logger *zap.Logger

func main() {
   initLogger()
   // 在程序退出之前把缓冲区里的文件都刷到硬盘上
   defer logger.Sync()
   httpGet("https://www.baidu.com")
   httpGet("https://www.google.com")
}

func initLogger() {
   writeSync := getLogWriter()
   encoder := getEncoder()
   // 第三个参数 可以 指定从哪个级别开始输出日志
   core := zapcore.NewCore(encoder, writeSync, zapcore.ErrorLevel)
   logger = zap.New(core)

}

// 返回一个json编码的格式 一般情况下都用这个
func getEncoder() zapcore.Encoder {
   return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
}

// 就是将日志写到何处
func getLogWriter() zapcore.WriteSyncer {
   // 这里我们每次都是重新打开文件,你也可以用open和append来追加文件,免的每次写入文件 都会覆盖掉之前的
   file, _ := os.Create("./test.log")
   return zapcore.AddSync(file)
}

func httpGet(url string) {
   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()
   }
}

image.png

这里的ts 代表时间戳,但是这个时间戳可读性是在是太差,当然也可以修改这个配置的

// 返回一个json编码的格式 一般情况下都用这个
func getEncoder() zapcore.Encoder {
   config := zap.NewProductionEncoderConfig()
   config.EncodeTime = zapcore.ISO8601TimeEncoder
   return zapcore.NewJSONEncoder(config)
}

image.png

我们甚至可以在日志中打印 是哪个方法 调用了日志所在的方法

image.png

只要修改如下的方法即可:

logger = zap.New(core,zap.AddCaller())

日志切割

如果一直向一个文件里面写入信息,文件会很快膨胀到xxx gb 这显然是无法忍受的,因此我们还需要日志切割归档功能

go get -u github.com/natefinch/lumberjack

func getLogWriterByJack() zapcore.WriteSyncer {
  logger := &lumberjack.Logger{
     Filename:   "./test.log",
     MaxSize:    10,// 单位是mb
     MaxBackups: 5,// 备份数量 切割文件之前 会把文件做备份
     MaxAge:     30, // 备份天数
     Compress:   false, //默认不压缩
  }
  return zapcore.AddSync(logger)
}

写个测试函数测试一下

for i := 0; i < 10000000; i++ {
   //httpGet("https://www.baidu.com")
   //httpGet("https://www.google.com")

   logger.Info("i:")
}

image.png

在gin中 集成zap

这里类似的文章有很多 甚至也有人直接做好了类似的功能 github.com/gin-contrib…

有兴趣的可以体验下,很简单,就不再过多介绍了,有需要的话 大家记得取一下即可。

整体上来说 并不难,也就是实现对应的logger和recovery 而已,大家可以自行下载源码以后

稍微改动一下 然后来适配成自己的项目