網頁

2021/9/11

Golang uber go zap log簡單範例

Go uber go zap log函式庫簡單範例。


範例環境:

  • Go 1.16


安裝

在專案根目錄輸入go get -u go.uber.org/zap下載並安裝zap。

~/.../go-demo$ go get -u go.uber.org/zap
go: downloading go.uber.org/zap v1.19.1
...
go get: added go.uber.org/zap v1.19.1

範例

透過zap的預配置(preset)函式NewExample()建立Logger實例,然後呼叫Logger.Sugar()轉成SugaredLogger來使用log。

NewExample()是在範例使用,此外還有NewDevelopment()NewProduction()來產生開發或生產環境的Logger實例。

defer suger.Sync()作用為在程式結束前清除log的buffer。

使用SugaredLogger不同層級的log方法Debug()Info()Error()等來印訊息,會根據zap的配置決定是否印出。

main.go

package main

import (
    "go.uber.org/zap"
)

func main() {

    sugar := zap.NewExample().Sugar() // create a new SugaredLogger instance
    defer sugar.Sync()

    sugar.Debug("debug message")
    sugar.Info("info message")
    sugar.Error("error message")
    sugar.Warn("warn message")
    sugar.Panic("panic message")
    sugar.Fatal("fatal message")
}

zap log印出結果如下。最下面的錯誤訊息是SugaredLogger.Panic()寫出的stack trace並離開函式main(),所以看不到SugaredLogger.Fatal()印出的訊息。

{"level":"debug","msg":"debug message"}
{"level":"info","msg":"info message"}
{"level":"error","msg":"error message"}
{"level":"warn","msg":"warn message"}
{"level":"panic","msg":"panic message"}
panic: panic message

goroutine 1 [running]:
go.uber.org/zap/zapcore.(*CheckedEntry).Write(0xc00014c0c0, 0x0, 0x0, 0x0)
        /Users/user/go/pkg/mod/go.uber.org/zap@v1.19.1/zapcore/entry.go:232 +0x532
go.uber.org/zap.(*SugaredLogger).log(0xc000117ea0, 0x4, 0x0, 0x0, 0xc000117eb8, 0x1, 0x1, 0x0, 0x0, 0x0)
        /Users/user/go/pkg/mod/go.uber.org/zap@v1.19.1/sugar.go:227 +0x111
go.uber.org/zap.(*SugaredLogger).Panic(...)
        /Users/user/go/pkg/mod/go.uber.org/zap@v1.19.1/sugar.go:123
main.main()
        /.../go-demo/main.go:16 +0x2f5
exit status 2

zap有兩種logger分別為LoggerSugaredLoggerSugaredLoggerLogger的一層包裝,提供訊息格式化API,但效能較Logger差一點。

Logger的使用方式同SugaredLogger

main.go

package main

import (
    "go.uber.org/zap"
)

func main() {

    logger := zap.NewExample()
    defer logger.Sync()

    logger.Info("failed to fetch URL",
        zap.String("url", "http://abc.com/get"),
        zap.Int("attempt", 3),
        zap.Bool("enabled", true),
    )
}

印出以下。

{"level":"info","msg":"failed to fetch URL","url":"http://abc.com/get","attempt":3,"enabled":true}


沒有留言:

張貼留言