使用案例
package main
import (
"go.uber.org/zap"
)
// 两种类型的日志记录器sugarlogger 和logger
var sugarlogger *zap.SugaredLogger
var logger *zap.Logger
func main() {
InitLogger()
defer sugarlogger.Sync()
sugarlogger.Info("sugerlogger:访问了sugerlogger")
logger.Info("logger:访问了sugerlogger")
}
func InitLogger() {
//logger = zap.NewExample() //测试环境
//{"level":"info","msg":"sugerlogger:访问了sugerlogger"}
//{"level":"info","msg":"logger:访问了sugerlogger"}
//logger, _ = zap.NewProduction() //用于生产环境
//{"level":"info","ts":1655276247.1967955,"caller":"zap/log.go:13","msg":"sugerlogger:访问了sugerlogger"}
//{"level":"info","ts":1655276247.1973336,"caller":"zap/log.go:14","msg":"logger:访问了sugerlogger"}
logger, _ = zap.NewDevelopment() //用户开发环境
//2022-06-15T14:58:40.060+0800 INFO zap/log.go:13 sugerlogger:访问了sugerlogger
//2022-06-15T14:58:40.076+0800 INFO zap/log.go:14 logger:访问了sugerlogger
sugarlogger = logger.Sugar()
}
自定义logger
将日志写入文件而不是终端
我们将使用 zap.new()方法配置
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"io"
"net/http"
"os"
"time"
)
var sugarLogger *zap.SugaredLogger
func main() {
InitLogger()
defer sugarLogger.Sync()
simpleHttpGet("www.google.com")
simpleHttpGet("http://www.google.com")
}
func InitLogger() {
encoder := getEncoder()
// test.log记录全量日志
logF, err := os.OpenFile("./test.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
c1 := zapcore.NewCore(encoder, zapcore.AddSync(logF), zapcore.DebugLevel)
// test.err.log记录ERROR级别的日志
errF, err := os.OpenFile("./test.err.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
c2 := zapcore.NewCore(encoder, zapcore.AddSync(errF), zap.ErrorLevel)
// 使用NewTee将c1和c2合并到core
core := zapcore.NewTee(c1, c2)
logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
sugarLogger = logger.Sugar()
}
func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder //设置编码格式
// 指定时间序列化函数,将时间序列化为 `2006-01-02 15:04:05.000` 格式,更易读
encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}
// 指定 time.Duration 序列化函数,将 time.Duration 序列化为经过的毫秒数的浮点数
// 毫秒数比默认的秒数更精确
encoderConfig.EncodeDuration = func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendFloat64(float64(d) / float64(time.Millisecond))
}
encoderConfig.MessageKey = "message"
encoderConfig.TimeKey = "timestamp"
return zapcore.NewConsoleEncoder(encoderConfig)
}
func getLogWriter() zapcore.WriteSyncer {
file, _ := os.Create("./test.log") //输出文件
ws := io.MultiWriter(file, os.Stdout) //输出终端
return zapcore.AddSync(ws)
//file, _ := os.Create("./test.log") //输出文件
//return zapcore.AddSync(file)
}
func simpleHttpGet(url string) {
sugarLogger.Debugf("Trying to hit GET request for %s", url)
resp, err := http.Get(url)
if err != nil {
sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
} else {
sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
resp.Body.Close()
}
}