stefafafan の fa は3つです

"すてにゃん" こと id:stefafafan のブログです

Go のアプリケーションで uber-go/zap を使っている場合は暗黙的にサンプリングが有効になっていないか見直しましょう

表題の通り、Goでロギングに GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go. を使っている場合、サンプリングの設定を見直しましょう。

背景

GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go. のFAQによると、 NewProductionConfig を使ってセットアップすると内部で勝手にサンプリングが有効になるようです。

Logs are dropped intentionally by zap when sampling is enabled. The production configuration (as returned by NewProductionConfig() enables sampling which will cause repeated logs within a second to be sampled.

zap/FAQ.md at master · uber-go/zap · GitHub

このことを知らずにこのライブラリを使っていると、知らず知らずのうちにログの一部が欠損します。詳しい内部実装については同僚がまとめてくれていました。
zenn.dev

どうするとよいか

まず何はともあれ、GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go. を使っている場合いい機会なのでサンプリングの設定を見直しましょう。

  • NewProductionConfig() を使ってる場合は暗黙的にサンプリングが有効化されているため、意図通りかどうか確認しましょう
  • 明示的に設定していたとしても、ログの設定を入れたのが前任のエンジニアだったりすることがあるので、現状を知るためにも見ておきましょう

サンプリングを完全に無効化したい場合は、 Samplingnil を設定することで対処できます。もちろん、ログは出せば出すほど負荷はかかるためあらかじめ検討した上でサンプリングの方針を決めましょう。

c := zap.NewProductionConfig()
+ c.Sampling = nil

slog

Go 1.21より公式に slog package - log/slog - Go Packages が追加されているため、 GitHub - uber-go/zap: Blazing fast, structured, leveled logging in Go. からの乗り換えの検討もあるでしょう。調べた感じでは slog にはサンプリング機構はなさそうなので、移行時に認識しておきましょう。

また、実際サンプリングしたい場合はサードパーティのライブラリがあるそうです。ただし私は slog および slog-sampling はまだしっかり触れていないためこれ以上詳しいことは言えません。

github.com