以下の内容はhttps://blog.stenyan.jp/entry/2023/11/23/120122より取得しました。


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




以上の内容はhttps://blog.stenyan.jp/entry/2023/11/23/120122より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14