📑

ログとトレースの使い分け

2024/11/15に公開

ログとトレースの使い分け

現代のシステム運用では、ログ管理が複雑化しがちです。特にアプリケーションのINFOやERRORログが増えると、情報の見通しが悪くなり、検索性も低下します。そこで、今回は、システムレベルとアプリケーションレベルでログとトレースを使い分け、オブザーバビリティを向上させる方法です。

オブザーバビリティの基本と課題

オブザーバビリティとは、システムの状態を把握し、問題を迅速に解決できる能力を意味します。一般的なアプローチでは、ログのINFO/WARN/ERRORレベルにユースケースやエラーの情報を記録しますが、これにより大量のデータが発生し、管理が難しくなります。また、自由形式のログメッセージでは、後からの検索や分析が煩雑になることが多いです。

アプリケーションのユースケースはトレースで

提案するのは、アプリケーションのユースケース情報をすべてトレースで記録し、より効率的な管理を実現する方法です。

  1. INFOレベルの情報をトレースのスパンに置き換える
    ユースケースのステップをトレースのスパン(Span)として記録し、各ステップの入出力(IO)や副作用などのコンテキスト情報をスパンの属性(Attributes)として登録します。さらに、カーディナリティの高い値やディメンションを反映させることで、後から高い検索性を持たせることができます。

  2. ERRORレベルはスパンのステータスとイベントに対応
    エラーや例外は、トレースのスパンステータスとしてエラーを設定し、例外の詳細(Stack Trace)はイベントとして記録することで、ログではなくトレースでの一貫したエラーハンドリングを行います。

システム的な情報はログで対応

ログ自体は不要になるわけではありませんが、システム全体の状況やリソース状態を示すシステム情報に集中させます。

  • INFO: サーバーの起動や設定の変更を記録
  • WARN: 非推奨(deprecated)な設定が使用されている場合
  • ERROR: ネットワーク障害やシステムレベルのエラー発生時

このようにシステム的なメッセージにログを使用し、アプリケーションのユースケースやステップに関する情報はトレースで一元管理することで、管理の簡素化と観測性の向上が見込めます。

実装方法

このアプローチを実装するためには、以下の手順が推奨されます。

  1. トレース機能を有効にし、ユースケースに基づいてスパンを記録する
  2. 必要なカーディナリティ・ディメンションの情報をスパン属性として設定する
  3. エラー処理をトレース内で完結させるよう、スパンのステータスやイベントを活用する
  4. システムログをINFO/WARN/ERRORに適宜分け、システム状態に関連するメッセージのみを記録する

この方法を導入することで、オブザーバビリティの向上だけでなく、監視精度の向上や、不要な情報によるログの混雑が緩和されることが期待できます。

参考

GitHubで編集を提案

Discussion