ログには「呼び出し ID」を含めるべきなのでは

2024/05/25 Kansai.go #1
小原 一哉

自己紹介

  • 小原 一哉 (こはら かずや)
  • ウェブエンジニア
  • フェンリル株式会社
  • X: @KoharaKazuya

本日は ログには「呼び出し ID」を含めるべきなんじゃないか? という提案をします。

「呼び出し ID」というのは私の造語で適切にはなんて呼ぶべきかわかってないです。いい名前あれば後で教えてほしいです。

ログに含めるべきものって?

  • 時刻: ログ出力時の時刻を特定する
    ↑ ログは後から見るので必須
  • テキスト: 主に開発者や運用担当者などの人間向けにメッセージを伝える
    ↑ 利便性の高さから含まないことはほぼありえない
  • レベル: 予想される重大度を分類する
    ↑ フィルタリングや自動化のためほぼ含まれる
  • ソースコード位置: ログ出力命令の記載箇所を特定する
    ↑ 含まれないことも多い。なくても困っていない現場も多いはず
  • スタックトレース: ログ出力に至るまでの呼び出し階層を特定する
    ↑ イベント発生時の状況再現に役立つ。含まれないことが多い (多分重いから)
  • リクエスト ID: Web システムにおいてリクエストを識別する
    ↑ Web においてはよく使われている

slog はどうなの?

デフォルトでは、

  • 時刻: 含む
  • テキスト: 含む
  • レベル: 含む
  • ソースコード位置: 含まない (オプションあり)
  • スタックトレース: 含まない
  • リクエスト ID: 含まない

ソースコード位置はベストな解決策なのか?

ソースコード位置を含めたい? でも、それって本当にやりたいことに対するベストな解決策でしょうか?

time=2024-05-19T16:39:55.017+09:00 level=INFO source=/…/main.go:15 msg=test

ソースコード位置の特定のため、ファイル名と行数が記録される

特定のための ID

記述箇所を特定したい、抽象的には「何かを特定したい」という課題に対しては我々プログラマーは ID を振ってきたはず。本質ではない属性の変更や時間に対する耐性のために ID を用いてきたはず。

  • ユーザー ID
  • 画面 ID
  • アプリ ID
  • API KEY
  • お問い合わせ番号

ソースコード上の位置は現代的な開発の中では頻繁に変わってしまう。

提案: 呼び出し箇所ごとに「呼び出し ID」を振ってログに含める

log.Info(ctx, log.L001, "データベースとの接続を開始します")

ポイント:

  • 記述箇所ごとにユニークにする (似たようなログでも呼び出し ID は別にする)
  • 未来永劫、変更しない&使い回さない
  • 呼び出し ID はソースコードの全文検索を想定し、L001 などの珍しい形にする
  • ログのテキストやレベルを変更しても ID は変えない
  • 運用時の解析を想定し、最終的に出力される構造化ログに含める

まとめ

  • ログに含めるべき情報を列挙し、slog との関係を述べた
  • 呼び出し ID とログに含めることを提案した