ログレベル完全解説:DEBUG、INFO、WARN、ERROR、FATAL の使い分け

ログレベルとは、各ログエントリに付ける重大度のラベルで、「何を記録し、何を表示し、何をアラートにするか」を制御します。標準的な規格では DEBUG、INFO、WARN、ERROR、FATAL の 5 段階があり、重大度が順に上がります。 レベル体系の核心的価値は、平常時はノイズを最小に抑えつつ、問題発生時にはレベルで素早く絞り込んでアラートできることです。

5 つの標準レベル早見表

レベル 意味 典型的な内容 本番環境 アラート
DEBUG デバッグ詳細 変数値、SQL 文、関数の引数 オフ なし
INFO 正常なビジネス節目 ログイン、注文作成、タスク開始 オン なし
WARN 異常だが自動回復 リトライ成功、フォールバック発動、低速リクエスト オン 集約して人間が確認
ERROR 操作が失敗し現在の処理に影響 API 5xx、決済失敗、ヌルポインタ オン あり
FATAL システム全体が使用不可 DB に接続できない、サービスが起動しない オン あり(P0 対応)

各レベルの判断基準

実務では、ログが足りないことよりレベルの誤用のほうがよく起きます。実行可能な判断基準は次のとおりです。

DEBUG:開発者本人が見るためのもの

  • 判断基準:システムが正常に動いている間は何の価値もなく、特定のバグ調査のときだけ役立つ情報;
  • 典型的な内容:関数の引数と戻り値、途中計算結果、キャッシュヒット状況;
  • 重要原則:本番環境ではデフォルトでオフ。削除ではなくフィルタしておく——問題発生時に一時的にオンにできます。

INFO:「システムが何をしているか」を見る人のためのもの

  • 判断基準:半年後にこのログを読み返して、ユーザーの操作の軌跡を復元できる;
  • 典型的な内容:重要なビジネスアクション(登録、注文、公開)、タスクの開始/終了と所要時間;
  • 逆の例:HTTP 200 をすべて INFO で記録する——それはアクセスログの仕事であり、ビジネスログを汚染しないこと。

WARN:異常は起きたが、システムが持ちこたえた

  • 判断基準:誰かが知るべきだが、夜中に飛び起きる必要はないもの;
  • 典型的な内容:リトライ後の成功、レート制限/フォールバックの発動、しきい値超えのレイテンシ;
  • リスクサイン:WARN の急増は ERROR の前触れであることが多い。トレンド監視につなげましょう。

ERROR:ユーザーの操作が失敗した

  • 判断基準:直さなければ、ユーザーは再び同じ問題に当たる;
  • 典型的な内容:外部サービス呼び出しの失敗、データ検証の例外、未捕捉例外;
  • 重要な要件:すべての ERROR にコンテキストを付ける(URL、ユーザー/テナント ID、リクエストパラメータ、スタックトレース)。なければ対処不能なノイズにすぎません。

FATAL:システムがすでに落ちている

  • 判断基準:サービス全体として正常な提供が不可能;
  • 典型的な内容:DB 接続失敗、必須設定の欠落、起動失敗;
  • 実務のコツ:Web アプリで FATAL は稀です。多くの「システムダウン」は ERROR の大量発生として現れるので「ERROR 急増アラート」でカバーし、FATAL を濫用して重大度を薄めないこと。

ブラウザ Console のログレベル

フロントエンドのレベルはバックエンドと同名ですが、できることは違います。Console がネイティブにサポートするのは次のとおりです。
メソッド Console 上のレベル 用途
console.debug() Debug(デフォルト非表示。Verbose を有効化) 開発中のデバッグ
console.log() Info 通常出力
console.info() Info 同上。意図を明示する書き方
console.warn() Warning、黄色 回復可能な問題のヒント
console.error() Error、赤、スタックトレース付き 失敗と未捕捉例外
実用的なヒント 2 つ:
  • フロントのデバッグ出力は console.log ではなく console.debug で書く——本番ビルドではデフォルトフィルタで自動的に隠れ、手動の掃除が不要になります;
  • 未捕捉例外(window.onerror / unhandledrejection)はデフォルトで ERROR レベルであり、本番調査の最初の手がかりになります。
  • フロントエンド特有の難題:ユーザーはログを取ってくれない

    バックエンドのログはサーバーに集約され、問題発生時にいつでも見られます。フロントエンドのログはユーザー一人ひとりのブラウザの中に散らばります。ユーザーが「ページが壊れた」と報告しても、Console エラーと失敗したリクエストはそのページセッションとともに消えます。ユーザーがチュートリアルに従って DevTools を開く頃(手順はブラウザコンソールの開き方)には、リロードでエラーはすでに流れ去っています。 したがってフロントエンドのログ戦略が答えるべき問いは「レベルをどう振り分けるか」ではなく、「壊れた瞬間のログをどう残すか」です。代表的な方式:
    方式 仕組み 代償
    自前の送信 console の全出力をサーバーへ送り返す ストレージ/プライバシーコストが高く、サンプリングの調整も難しい
    フロント監視プラットフォーム 全量収集+セッションリプレイ 従量課金で中小チームには高額
    オンデマンド収集(バグレポートに添付) ユーザーがフィードバックを送信する際、その瞬間の Console/Network エラーが自動で添付される コスト最小。「ユーザーからの自発的報告」という最大の情報源をカバー
    3 つ目の方式はバグレポートと自然に噛み合います。ユーザーがバグを報告する瞬間こそ、ログが必要な瞬間だからです。 BugCapturer はまさにこのオンデマンド収集を採用しています。ユーザー(まったくの技術非対応者でも)がブラウザ拡張やページ埋め込み SDK から注釈付きスクリーンショット/録画を送信すると、レポートにはその時点の Console エラー(ERROR のスタックトレース込み)と失敗した Network リクエスト、さらに URL とブラウザ環境が自動で付きます(詳細は診断機能)。開発者の手元には ERROR レベルのログコンテキスト付きのレポートが届くので、「F12 を開いてコピーして」と頼む必要はもうありません。レポートはログイン不要の共有リンクにできるほか、Slack / Microsoft Teams チャネルへ自動投稿して一元的に追跡できます。

    よくある誤り

    誤り 正しいやり方
    すべて console.log で、公開後も掃除しない レベルを分ける:デバッグは debug、ビジネス節目は info、ビルド時に debug を落とす
    失敗を「運用を怖がらせないように」と INFO で記録 失敗は ERROR。アラートはレベルに依存するのであって、人がログを読むことに依存してはならない
    ERROR がメッセージだけでコンテキストなし URL、パラメータ、スタックトレースを必ず添付。なければ何も記録していないのと同じ
    調査の便利さから全ログで DEBUG をオン レベルはフィルタです。普段は DEBUG をオフにし、問題発生時に必要な範囲だけオンに
    WARN が大量に滞留し誰も手をつけない WARN をトレンドアラートにつなぐ。急増は ERROR の前兆

    FAQ

    Q:ログレベルには何種類ありますか? A:標準は DEBUG、INFO、WARN、ERROR、FATAL の 5 段階です。一部のフレームワーク(Syslog、Trace 系など)には TRACE/NOTICE/CRITICAL などの変種がありますが、意味は上の表に一対一で対応します。 Q:logging levels はどう選び、設定すればいいですか? A:開発環境は全部オン(DEBUG から)、本番は INFO か WARN から。ERROR はアラートに、WARN はトレンド監視につなぎます。ライブラリは業務コードと分けて設定し、依存ライブラリの DEBUG に流されないようにしましょう。 Q:フロントエンドもバックエンドと同様にログレベル分けが必要ですか? A:必要ですが簡略化できます。「debug / info / warn / error」の 4 段階で十分です。重要なのは ERROR にスタックトレースを付け、そして「壊れた瞬間のログを残す」問題を解決することです。 Q:ユーザーがバグを報告するとき、Console エラーを送ってもらうには? A:技術非対応のユーザーにエラーをコピーしてもらうのはまず無理です。BugCapturer のようなツールを使えば、送信時に Console/Network エラーを自動で取得できます。上の「オンデマンド収集」の節を参照してください。