Go-日志库Zap

什么是zap

  • 快,非常快,这也是 zap 最显著的特点。速度快的原因是 zap 避免使用 interface{} 和反射,并且使用 sync.Pool 减少堆内存分配。在 zap 面前 Logrus 的执行速度只有被吊打的份,你可以在官方 GitHub 仓库中看到 zap 与不同日志库的速度对比。
  • 支持结构化日志记录。这是一个优秀的日志库必备功能。
  • 支持七种日志级别:DebugInfoWarnErrorDPanicPanicFatal,其中 DPanic 是指在开发环境下(development)记录日志后会进行 panic
  • 支持输出调用堆栈。
  • 支持 Hooks 机制。

安装

go get -u go.uber.org/zap

基础使用

// suger 模式会稍微比logger 原生慢一点

	logger, _ := zap.NewDevelopment()
//logger, _ := zap.NewDevelopment()
defer logger.Sync()
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
// Structured context as loosely typed key-value pairs.
"url", "url",
"attempt", 3,
"backoff", time.Second,
)
// 更高性能,指明类名,不需要启动反射
url:="www.piwriw.com"
sugar.Info("failed to fetch URL",
zap.String("url",url),
zap.Int("age",18),
)
sugar.Infof("Failed to fetch URL: %s", "url")

配置zap,logger路径

package main

import (
"go.uber.org/zap"
)

func NewLogger() (*zap.Logger, error) {
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{"./project.log",
"stderr",
"stdout"}
return cfg.Build()
}
func main() {
logger, err := NewLogger()
if err != nil {
panic(err)
}
sugar := logger.Sugar()
defer sugar.Sync()

}

整合到gin

package middleware

import "go.uber.org/zap"

func InitLogger() {
logger, err := NewLogger()
if err != nil {
panic(err)
}
zap.ReplaceGlobals(logger)
}
func NewLogger() (*zap.Logger, error) {
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{"./project.log",
"stderr",
"stdout"}
return cfg.Build()
}