ログレベルとは、ログの「重要度」を表す区分です。ERROR・WARN・INFO・DEBUGなどのレベルを正しく使い分けると、障害のときに本当に見るべきログがすぐに見つかり、必要なときだけ人に通知できるようになります。

逆に、使い分けがあいまいだと、ERRORが毎日大量に出て誰も見なくなる、障害が起きたのに手がかりになるログがない、といった状態になりがちです。この記事では、各レベルの意味を整理したうえで、迷ったときの判断フローと、20の具体例、そしてJSON形式の構造化ログや、出してはいけない情報など、ログ設計の実務まで解説します。

ログレベルの早見表

レベル 意味 対応 本番で出すか
FATAL システム全体が続行できない 即時対応 出す
ERROR 処理が失敗し、人の対応が必要 通知して対応する 出す
WARN 想定外だが、処理は続けられた。放っておくと問題になりうる 定期的に確認、増えたら対応 出す
INFO 正常な処理の重要な節目 通常は見ない。調査のときに使う 出す
DEBUG 開発・調査用の詳しい情報 開発時や、一時的に有効にして調査 通常は出さない
TRACE DEBUGよりさらに細かい情報 ごく限られた調査 出さない

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ログレベルの使い分け|ERROR・WARN・INFO・DEBUGの判断基準とログ設計」

レベルは TRACE < DEBUG < INFO < WARN < ERROR < FATAL の順に重要になります。出力のレベルを INFO に設定すると、INFO以上(INFO・WARN・ERROR・FATAL)が出力され、DEBUG・TRACEは出力されません。

迷ったときの判断フロー

質問 はい → いいえ →
処理が失敗し、人が対応しないと利用者に影響が残るか ERROR 次へ
処理は続けられたが、想定外のことが起きたか(再試行した、代わりの値を使った、など) WARN 次へ
運用で追いたい、正常な節目か(起動、注文の確定、バッチの開始と終了など) INFO 次へ
開発や調査のときに詳しく知りたい情報か DEBUG 出さない

判断の軸は、「このログを見た人が、何をすべきか」です。ERRORなら「対応する」、WARNなら「気にかける」、INFOなら「記録として残す」。対応が必要ないものをERRORにしないことが、使い分けで最も大切なルールです。

このログは何レベル? 20の具体例

# 場面 レベル 理由
1 アプリケーションが起動した INFO 正常な節目
2 設定ファイルが読み込めず、起動できない FATAL / ERROR 続行できない
3 注文が確定した INFO 業務の重要な節目
4 決済APIの呼び出しが失敗し、注文を確定できなかった ERROR 利用者に影響、対応が必要
5 外部APIがタイムアウトしたが、再試行で成功した WARN 想定外だが処理は続けられた
6 外部APIが3回の再試行でも失敗した ERROR 処理が失敗した
7 利用者がパスワードを間違えた INFO(またはWARN) 利用者の誤りで、システムの異常ではない
8 同じIPから短時間にログイン失敗が100回 WARN 攻撃の可能性。監視の対象
9 入力チェックでエラー(数量が0) INFO(またはDEBUG) 利用者の入力の誤り。ERRORにしない
10 存在しないURLへのアクセス(404) INFO(またはDEBUG) よくあること。大量ならWARN
11 想定外の例外で500エラーを返した ERROR システムの不具合
12 実行されたSQLの内容 DEBUG 調査用の詳しい情報
13 メソッドの開始・終了 TRACE / DEBUG 通常は不要
14 バッチ処理の開始・終了と件数 INFO 運用で追う節目
15 バッチ処理で1件だけデータ不正があり、スキップした WARN 処理は続けたが、確認が必要
16 ディスクの空きが20%を切った WARN 放っておくと問題になる
17 非推奨の設定が使われている WARN 将来問題になる
18 キャッシュが見つからず、DBから取得した DEBUG 通常の動作
19 応答が遅かった(しきい値の3秒を超えた) WARN 性能の劣化の兆候
20 DBへの接続が切れ、再接続に成功した WARN 想定外だが回復した

利用者の入力の誤り(#7・#9・#10)をERRORにしないのがポイントです。ERRORは「システム側が対応すべきこと」に限ると、ERRORの通知が来たときに必ず対応する、という運用ができます。

アラートとの対応を決める

レベル 通知 例
FATAL / ERROR すぐに通知(チャット、電話) 1件でも通知、または5分間に一定件数を超えたら通知
WARN 件数の増加で通知、または日次のレポート 1時間に100件を超えたら通知
INFO 通知しない 調査や分析で検索する

ログレベルは、アラートのルールとセットで決めると意味を持ちます。「ERRORが出たら必ず誰かが見る」という約束があるからこそ、ERRORの基準を厳しく守る意味が出てきます。

環境ごとの出力レベル

環境 出力レベルの目安
開発環境 DEBUG
検証環境 DEBUG または INFO
本番環境 INFO(ログの量が多すぎる場合は、特定の部分だけWARN)

本番で調査が必要になったときに、再起動せずに特定のクラスだけDEBUGに切り替えられる仕組み(Spring Bootの Actuator など)を用意しておくと便利です。

何をログに出すか

調査に役立つログには、次の情報が含まれています。

項目 例 役割
日時(タイムゾーン付き) 2026-09-28T21:58:39+0900 いつ起きたか
レベル ERROR 重要度
メッセージ 決済金額の計算に失敗しました 何が起きたか
リクエストID req-7f3a 1つのリクエストに関するログを横断して追う
業務のID order_id=123 どのデータで起きたか
処理時間 duration_ms=3200 遅延の調査
例外の情報 ZeroDivisionError: division by zero 原因

「何が起きたか」だけでなく、「どのデータで、どのリクエストで」がわかるようにしておくと、障害の調査が大きく早くなります。

構造化ログ(JSON形式)

ログをJSON形式で出すと、ログの管理サービス(CloudWatch Logs、Datadogなど)で、項目ごとに検索・集計できます。PythonでJSON形式のログを出力した実行結果です。

{"time": "2026-09-28T21:58:39+0900", "level": "INFO", "logger": "order", "message": "注文を受け付けました", "request_id": "req-7f3a", "user_id": 42, "order_id": 123, "duration_ms": 85}
{"time": "2026-09-28T21:58:39+0900", "level": "WARNING", "logger": "order", "message": "外部APIの応答が遅い(再試行1回目)", "request_id": "req-7f3a", "user_id": 42, "duration_ms": 3200}
{"time": "2026-09-28T21:58:39+0900", "level": "INFO", "logger": "order", "message": "確認メールを送信しました: t***@example.com", "request_id": "req-7f3a", "user_id": 42}
{"time": "2026-09-28T21:58:39+0900", "level": "ERROR", "logger": "order", "message": "決済金額の計算に失敗しました", "request_id": "req-7f3a", "user_id": 42, "order_id": 123, "error": "ZeroDivisionError: division by zero"}
  • 出力レベルをINFOにしているため、同じプログラムで出したDEBUGのログ(SQLの内容)は出力されていません
  • 3行目のメールアドレスは、マスキングの仕組みで t***@example.com に置き換えています
  • request_id で検索すると、1つのリクエストの流れをまとめて追えます

"注文 123 を受け付けました" のように値を文章に埋め込むより、"order_id": 123 のように項目として分けると、「order_id=123 のログをすべて表示」といった検索ができます。

ログに出してはいけない情報

出してはいけないもの 例
認証の情報 パスワード、APIキー、アクセストークン、セッションID
決済の情報 クレジットカード番号、セキュリティコード
個人情報 氏名、住所、電話番号、メールアドレス(必要ならマスキング)
機密の業務データ 契約の金額、社外秘の情報
リクエストの全文 上記が含まれることがあるため、項目を選んで出す

ログは、多くの人が見られる場所に、長期間保存されることが多いデータです。「リクエストのJSONをそのままログに出す」書き方は、意図せず個人情報やパスワードを残す原因になります。出す項目を選ぶ、マスキングの仕組みを入れるのが基本です。

Java(SLF4J)での書き方

private static final Logger log = LoggerFactory.getLogger(OrderService.class);

// ○ プレースホルダーを使う
log.info("注文を受け付けました orderId={} quantity={}", order.id(), order.quantity());

// × 文字列の連結(DEBUGが無効でも、文字列の組み立てが実行される)
log.debug("注文の詳細: " + order.toDetailString());

// ○ 例外は最後の引数に渡す(スタックトレースが出力される)
log.error("決済に失敗しました orderId={}", order.id(), e);

リクエストIDは、MDC(Mapped Diagnostic Context)に入れておくと、そのリクエストの処理中に出したすべてのログに、自動で付けられます。

よくある失敗

失敗 起きること 改善
利用者の入力エラーをERRORにする ERRORが大量に出て、本当の障害が埋もれる INFOやDEBUGにする
ログに出して、さらに再スローする 1つのエラーで同じログが何回も出る 最後に受け止めた場所で1回だけ出す
ループの中でINFOを出す ログが大量になり、費用と検索の手間が増える 件数をまとめて1回出す
例外のメッセージだけ出す 原因(スタックトレース)がわからない 例外オブジェクトごと渡す
「エラーが発生しました」だけ どのデータで何が起きたかわからない 業務のIDと状況を含める
個人情報をそのまま出す 情報漏えいのリスク 項目を選ぶ・マスキングする

よくある質問

Q. WARNとERRORの境目がわかりません。 A. 「人がすぐに対応する必要があるか」で分けるのがおすすめです。処理が失敗して利用者に影響が残るならERROR、処理は続けられたが気にかけておきたいならWARNです。チームで具体例の表を作っておくと、判断がぶれにくくなります。

Q. ログはどれくらいの期間、保存すればいいですか? A. 業務や契約、法令の要件によって異なります。調査用のログは数週間〜数か月、監査が必要なログは年単位など、ログの種類ごとに保存期間を決め、費用とのバランスを取ります。

Q. 本番でDEBUGを出したままにしてもいいですか? A. ログの量が大きく増え、費用や性能に影響するほか、詳しい情報が出るぶん機密情報が含まれるリスクも高まります。調査のときだけ、対象を絞って一時的に有効にするのがおすすめです。

まとめ

  • ログレベルは、「このログを見た人が何をすべきか」で決める
  • ERRORは人の対応が必要なものだけ。利用者の入力の誤りはERRORにしない
  • WARNは「処理は続いたが想定外」、INFOは「正常な節目」、DEBUGは「調査用」
  • アラートのルールとセットで決める
  • ログにはリクエストIDと業務のIDを含め、JSON形式の構造化ログで検索しやすくする
  • パスワード・カード番号・個人情報は出さない。マスキングの仕組みを入れる

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ログレベルの使い分け|ERROR・WARN・INFO・DEBUGの判断基準とログ設計」

株式会社RJCでは、運用まで見据えたシステムづくりの工夫を、プロジェクトの中で仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?