文章目录
简介
众所周知,Zap 是个很 nb 的日志框架,作为入门篇,本文主要用几个例子来直观地感受下 Zap 写出来的日志长什么样,符不符合我们的需求(主要是审美需求),性能什么的我们攒钱不 care。
以下栗子由浅入深,循序渐进,大部分栗子可以直接 copy 运行。
Cases
case 1: Hello World
Zap 的 Hello World 代码大概长下面这样:
package main
import (
"fmt"
"go.uber.org/zap"
)
func main() {
var logger *zap.Logger
logger, _ = zap.NewProduction()
logger.Debug("i am debug") // 这行不会打印,因为默认日志级别是 INFO
logger.Info("i am info") // INFO 级别日志,这个会正常打印
logger.Warn("i am warn") // WARN 级别日志,这个会正常打印
logger.Error("i am error") // ERROR 级别日志,这个会打印,并附带堆栈信息
logger.Fatal("i am fatal") // FATAL 级别日志,这个会打印,附带堆栈信息,并调用 os.Exit 退出
fmt.Println("can i be printed?") // 这行不会打印,呃...上面已经退出了
}
编译运行该程序,输出大概如下:
{
"level":"info","ts":1608362501.672074,"caller":"zap2/main.go:11","msg":"i am info"}
{
"level":"warn","ts":1608362501.672139,"caller":"zap2/main.go:12","msg":"i am warn"}
{
"level":"error","ts":1608362501.672147,"caller":"zap2/main.go:13","msg":"i am error","stacktrace":"main.main\n\t/Users/jack/go/src/helloworld/zap2/main.go:13\nruntime.main\n\t/usr/local/Cellar/go/1.15.2/libexec/src/runtime/proc.go:204"}
{
"level":"fatal","ts":1608362501.6721768,"caller":"zap2/main.go:14","msg":"i am fatal","stacktrace":"main.main\n\t/Users/jack/go/src/helloworld/zap2/main.go:14\nruntime.main\n\t/usr/local/Cellar/go/1.15.2/libexec/src/runtime/proc.go:204"}
以上代码应该是相当简洁易懂了,在这里需要再唠嗑一下的是关于输出的日志的几个字段的说明:
- level: 顾名思义,就是日志的级别了,默认的日志级别是 INFO,所以我们的第一行日志没有被打印出来
- ts: timestamp,时间戳的意思
- caller: 调用者,就是打印日志的那行代码的位置
- stacktrace: 调用堆栈,及打印日志的那行代码所在的堆栈信息,默认 ERROR 级别及以上的日志会附带堆栈信息,可以修改
case 2: SugaredLogger
Sugar 是糖的意思,顾名思义,zap.SugaredLogger 就是对 zap.Logger 进行了封装,提供了一些高级的语法糖特性,如支持使用类似 fmt.Printf 的形式进行格式化输出,使用 zap.SugaredLogger 改造一下上面的例子:
package main
import (
"fmt"
"go.uber.org/zap"
)
func main() {
var sugaredLogger *zap.SugaredLogger
logger, _ := zap.NewProduction()
sugaredLogger = logger.Sugar()
sugaredLogger.Debugf("i am debug, using %s", "sugar") // 这行不会打印,因为默认日志级别是 INFO
sugaredLogger.Infof("i am info, using %s", "sugar") // INFO 级别日志,这个会正常打印
sugaredLogger.Warnf("i am warn, using %s", "sugar") // WARN 级别日志,这个会正常打印
sugaredLogger.Errorf("i am error, using %s", "sugar") // ERROR 级别日志,这个会打印,并附带堆栈信息
sugaredLogger.Fatalf("i am fatal, using %s", "sugar") // FATAL 级别日志,这个会打印,附带堆栈信息,并调用 os.Exit 退出
fmt.Println("can i be printed?") // 这行不会打印,呃...上面已经退出了
}
编译运行该程序,输出类似如下:
{

最低0.47元/天 解锁文章
736

被折叠的 条评论
为什么被折叠?



