👀

Go のロギングライブラリ zap について

2021/10/02に公開

zap とは

ほぼタイトル通りですが、Go のサードパーティ製のロギングライブラリです。
https://github.com/uber-go/zap
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