- 技術 💻
ログレベルの使い分け|ERROR・WARN・INFO・DEBUGの判断基準とログ設計
ログレベルとは、ログの「重要度」を表す区分です。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期連続の黒字決算。