Zap提供了两种类型的日志记录器—Sugared Logger和Logger。官网
在性能很好但不是很关键的上下文中,使用SugaredLogger。它比其他结构化日志记录包快4-10倍,并且支持结构化和printf风格的日志记录。
在每一微秒和每一次内存分配都很重要的上下文中,使用Logger。它甚至比SugaredLogger更快,内存分配次数也更少,但它只支持强类型的结构化日志记录
安装
go get -u go.uber.org/zap
zap生产环境zap.NewProduction()和开发环境zap.NewDevelopment()
开发环境输出格式
生产环境输出格式
Sugared Logger模式
package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewDevelopment()
defer logger.Sync() // flushes buffer, if any
url := "https://baidu.com"
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
// Structured context as loosely typed key-value pairs.
"url", url,
"attempt", 3,
)
sugar.Infof("Failed to fetch URL: %s", url)
}
Logger模式
package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewDevelopment()
defer logger.Sync() // flushes buffer, if any
url := "https://baidu.com"
logger.Info("failed to fetch URL",
zap.String("url", url),
zap.Int("nums", 3))
}
suger模式将日志输出到文件中,配置stderr或stdout即可将日志打印
package main
import (
"time"
"go.uber.org/zap"
)
func NewLogger() (*zap.Logger, error) {
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{
"./myproject.log",
"stderr",
}
return cfg.Build()
}
func main() {
logger, err := NewLogger()
if err != nil {
panic(err)
//panic("初始化logger失败")
}
su := logger.Sugar()
defer su.Sync()
url := "https://baidu.com"
su.Info("failed to fetch URL",
// Structured context as strongly typed Field values.
zap.String("url", url),
zap.Int("attempt", 3),
zap.Duration("backoff", time.Second),
)
}
zap的便捷使用,通过zap.ReplaceGlobals初始后logger之后可以直接通过zap.S()和zap.L()使用zap,S函数和L函数很有用,提供了全局的安全访问logger的途径。
package main
import "go.uber.org/zap"
func main() {
logger, _ := zap.NewProduction()
zap.ReplaceGlobals(logger)
zap.S().Infof("启动服务器,端口:%d", 8080)
}
日志是分级别的Debug、Info、Warn、Error和Fetal,开发模式所有级别的日志都会打印,生产模式只会打印Info以上的级别的日志。