导入zap库:
go get -u go.uber.org/zap
基本使用:
package main
import (
"go.uber.org/zap"
)
func SugarProductionLogger() {
logger, _ := zap.NewProduction() //生成环境中使用
defer logger.Sync() // flushes buffer, if any
message := "SugerLogger_Production"
sugar := logger.Sugar()
sugar.Infow("failed to fetch Message", "Message", message) // Structured context as loosely typed key-value pairs.
sugar.Infof("failed to fetch Message: %s", message)
}
func SugarDevelopmentLogger() {
logger, _ := zap.NewDevelopment() //开发环境中使用
defer logger.Sync() // flushes buffer, if any
message := "SugerLogger_Development"
sugar := logger.Sugar()
sugar.Infow("failed to fetch Message", "Message", message) // Structured context as loosely typed key-value pairs.
sugar.Infof("failed to fetch Message: %s", message)
}
// zap 中提供了两种日志记录器,SugaredLogger和Logger ,相比较之下Logger的性能优于SugaredLogger但是使用上也相对欠缺方便
func NewLogger() {
logger, _ := zap.NewProduction()
defer logger.Sync()
message := "Logger"
logger.Info("failed to fetch message", zap.String("Message", message))
}
func main() {
SugarProductionLogger()
SugarDevelopmentLogger()
NewLogger()
}
运行结果:
zap.NewProduction()和zap.NewDevelopment()是在不同的情况下使用
两函数的区别在于一些配置
将日志输出到文件中:
package main
import (
"go.uber.org/zap"
"time"
)
func NewLogger() (logger *zap.Logger, err error) {
cfg := zap.NewProductionConfig() //这里不在调用zap.NewProduction()
cfg.OutputPaths = []string{
"./FileName.log", //文件需要存储的位置和名称
"stderr", //终端输出
"stdout", //终端输出
}
return cfg.Build()
}
func main() {
logger, err := NewLogger()
if err != nil {
return
}
Massage := "Log write file"
defer logger.Sync()
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL", "Massage", Massage, "backParam", time.Second)
}
在gin中使用zap库
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"net/http"
)
func main() {
port := 8080
logger, _ := zap.NewProduction()
defer logger.Sync()
sugar := logger.Sugar() //func (log *Logger) Sugar() *SugaredLogger
//上述代码可以简化为 zap.S() sugarLogger 这里都是返回*SugaredLogger
//zap.L()返回的就是Logger日志记录器
//zap.L()和zap.S()提供了一个安全访问logger的方式
/*
func S() *SugaredLogger {
_globalMu.RLock()
s := _globalS
_globalMu.RUnlock()
return s
}
*/
zap.ReplaceGlobals(logger) //将全局的logger变为zap.NewProduction()返回的
zap.S() //func S() *SugaredLogger 这里的zap.S()可以生成一个全局的logger
r := gin.Default()
r.GET("/", func(context *gin.Context) {
context.JSON(http.StatusOK, gin.H{
"message": "zap应用到Gin中",
})
})
sugar.Infof("启动服务监听端口:%d", port)
zap.S().Infof("zap.S()启动服务监听端口:%d", port)
err := r.Run(fmt.Sprintf(":%d", port))
if err != nil {
sugar.Errorw("启动服务错误", "message", err)
}
}
运行结果