说明
- 之前翻译的一个教程(没有备份原地址,梯子被封了)。原地址找到后补上
zap的安装
- 开源仓库地址 https://github.com/uber-go/zap
- 安装 go get -u go.uber.org/zap
默认的三种设置
- Example
- Development
- Production
Example
func main() {
log := zap.NewExample()
log.Debug("This is a DEBUG message")
log.Info("This is an INFO message")
log.Info("This is an INFO message with fields", zap.Strings("region", []string{"us_west"}), zap.Int("id", 2))
log.Warn("This is a WARN message")
log.Error("This is an ERROR message")
log.DPanic("This is a DPANIC message")
}
输出:
{"level":"debug","msg":"This is a DEBUG message"}
{"level":"info","msg":"This is an INFO message"}
{"level":"info","msg":"This is an INFO message with fields","region":["us_west"],"id":2}
{"level":"warn","msg":"This is a WARN message"}
{"level":"error","msg":"This is an ERROR message"}
{"level":"dpanic","msg":"This is a DPANIC message"}
Development
func main() {
log, _ := zap.NewDevelopment()
log.Debug("This is a DEBUG message")
log.Info("This is an INFO message")
log.Info("This is an INFO message with fields", zap.Strings("region", []string{"us_west"}), zap.Int("id", 2))
log.Warn("This is a WARN message")
log.Error("This is an ERROR message")
//log.Fatal("This is a FATAL message") // 程序在这停止如果不注释
//log.DPanic("This is a DPANIC message") // 程序在这停止如果不注释
//log.Panic("This is a PANIC message") // 程序在这停止如果不注释
}
输出
2018-10-30T17:14:22.459+0800 DEBUG development/main.go:7 This is a DEBUG message
2018-10-30T17:14:22.459+0800 INFO development/main.go:8 This is an INFO message
2018-10-30T17:14:22.459+0800 INFO development/main.go:9 This is an INFO message with fields {"region": ["us_west"], "id": 2}
2018-10-30T17:14:22.459+0800 WARN development/main.go:10 This is a WARN message
main.main
/home/wsl/gopath/src/wsl_learn/zap-example/development/main.go:10
runtime.main
/usr/local/go/src/runtime/proc.go:201
2018-10-30T17:14:22.459+0800 ERROR development/main.go:11 This is an ERROR message
main.main
/home/wsl/gopath/src/wsl_learn/zap-example/development/main.go:11
runtime.main
/usr/local/go/src/runtime/proc.go:201
Production
func main() {
log, _ := zap.NewProduction()
log.Debug("This is a DEBUG message")
log.Info("This is an INFO message")
log.Info("This is an INFO message with fields", zap.Strings("region", []string{"us-west"}), zap.Int("id", 2))
log.Warn("This is a WARN message")
log.Error("This is an ERROR message")
//log.Fatal("This is a FATAL message") // 程序在这停止如果不注释
log.DPanic("This is a DPANIC message")
//log.Panic("This is a PANIC message") // 程序在这停止如果不注释
}
输出
{"level":"info","ts":1540891173.3190675,"caller":"production/main.go:8","msg":"This is an INFO message"}
{"level":"info","ts":1540891173.3191047,"caller":"production/main.go:9","msg":"This is an INFO message with fields","region":["us-west"],"id":2}
{"level":"warn","ts":1540891173.3191204,"caller":"production/main.go:10","msg":"This is a WARN message"}
{"level":"error","ts":1540891173.31913,"caller":"production/main.go:11","msg":"This is an ERROR message","stacktrace":"main.main\n\t/home/wsl/gopath/src/wsl_learn/zap-example/production/main.go:11\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:201"}
{"level":"dpanic","ts":1540891173.3191597,"caller":"production/main.go:13","msg":"This is a DPANIC message","stacktrace":"main.main\n\t/home/wsl/gopath/src/wsl_learn/zap-example/production/main.go:13\nruntime.main\n\t/usr/local/go/src/runtime/proc.go:201"}
三种预设方式的对比
-
Example
和Production
使用的是json
格式输出,Development
使用行的形式输出 -
Development
- 从警告级别向上打印到堆栈中来跟踪
- 始终打印包/文件/行(方法)
- 在行尾添加任何额外字段作为json字符串
- 以大写形式打印级别名称
- 以毫秒为单位打印ISO8601格式的时间戳
-
Production
- 调试级别消息不记录
- Error,Dpanic级别的记录,会在堆栈中跟踪文件,Warn不会
- 始终将调用者添加到文件中
- 以时间戳格式打印日期
- 以小写形式打印级别名称
Sugar Logger
默认的zap记录器需要结构化标签,即对每个标签,需要使用特定值类型的函数
logger.Info("This is an INFO message with fields",
zap.String("region", "us-west"),
zap.Int("id", 2))
虽然会显的很长,但是对性能要求较高的话,这是最快的选择。也可以使用suger logger
, 它基于printf分割的反射类型检测,提供更简单的语法来添加混合类型的标签
func main() {
logger, _ := zap.NewDevelopment()
slogger := logger.Sugar()
slogger.Info("Info() uses sprint")
slogger.Infof("Infof() uses %s", "sprintf")
slogger.Infow("Infow() allows tags", "name", "Legolas", "type", 1)
}
输出
func main() {
logger, _ := zap.NewDevelopment()
slogger := logger.Sugar()
slogger.Info("Info() uses sprint")
slogger.Infof("Infof() uses %s", "sprintf")
slogger.Infow("Infow() allows tags", "name", "Legolas", "type", 1)
}
如果需要,可以随时使用记录器上的.Desugar()
方法从sugar logger
切换到标准记录器
log := slogger.Desugar()
log.Info("After Desugar; INFO message")
log.Warn("After Desugar; WARN message")
log.Error("After Desugar; ERROR message")
有疑问加站长微信联系(非本文作者)