👀
Go のロギングライブラリ zap について
zap とは
ほぼタイトル通りですが、Go のサードパーティ製のロギングライブラリです。
zap について、特徴や基本的な使い方をまとめてみました。環境
- macOS Big Sur 11.3.1
- go 1.16.5 darwin/amd64
- zap v1.15.0
特徴
- リフレクションを使わない。
- インターフェースを持っていない。
- sync.Pool でアロケーションを回避している。
また、こちらによると、zap は他のロギングライブラリや標準パッケージより速いみたいです。
Logger と SugaredLogger の違い
- Logger
- 高速
- 型に厳しい
- 構造化ロギングのみ可能
- SugaredLogger
- 少し低速
- 型に甘い(Sugar だけに)
- 構造化ロギングが可能
- printf スタイルのロギングが可能
サンプルコード
- Logger
logger, _ := zap.NewProduction()
defer logger.Sync()
url := "https://example.com/"
logger.Info("failed to fetch URL",
// Structured context as strongly typed Field values.
zap.String("url", url),
zap.Int("attempt", 3),
zap.Duration("backoff", time.Second),
)
出力結果
{"level":"info","ts":1633150860.2312949,"caller":"zap-example/main.go:13","msg":"failed to fetch URL","url":"https://example.com/","attempt":3,"backoff":"1"}
- SugaredLogger
logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
sugar := logger.Sugar()
url := "https://example.com/"
sugar.Infow("failed to fetch URL",
// Structured context as loosely typed key-value pairs.
"url", url,
"attempt", 3,
"backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)
出力結果
{"level":"info","ts":1633151590.2312949,"caller":"zap-example/main.go:13","msg":"failed to fetch URL","url":"https://example.com/","attempt":3,"backoff":"1"}
{"level":"info","ts":1633151590.232893,"caller":"zap-example/main.go:19","msg":"failed to fetch URL: https://example.com/"}
まとめ
以上、Go のロギングライブラリ zap について紹介しました。
速度がどうしても気になるという時に Logger を使い、それ以外の場合は基本 SugaredLogger で問題ないかと思います。
他にも Config をいじればログをカスタマイズできますが、それはまた機会があれば記事にしようと思います。
Discussion