DEBUG, INFO, WARN, ERROR の違いと使い方|Spring Bootのログレベルをやさしく解説
新人
「先輩、Spring Bootで実行するときに、いろんなメッセージが出てくるんですが、あれって何なんですか?」
先輩
「それはログだね。Spring Bootでは、アプリの動きを確認するためにログを出力しているんだよ。DEBUGとかINFOとか見たことない?」
新人
「あります!でも違いがよく分からなくて……どれもメッセージに見えちゃいます。」
先輩
「そのあたりは開発ではとても大事なポイントなんだ。Spring Bootでは、ログレベルを使い分けることで、開発中と本番で出力内容を変えることができるんだ。」
新人
「なるほど……つまり、ログレベルってアプリの情報を出す“段階”みたいなものなんですね?」
先輩
「そういうこと!じゃあまず、ログレベルの基本から見ていこうか。」
1. ログレベルとは何か?(Spring Bootにおける基本の仕組み)
Spring Bootのアプリケーションを実行すると、コンソール上にさまざまなメッセージが表示されます。これらは「ログ」と呼ばれ、アプリがどんな処理を行っているのか、どんな問題が起きたのかを確認するための重要な情報源です。特に、Spring BootではSLF4JとLogbackという仕組みを利用して、ログの出力を制御しています。
ログにはレベルがあり、開発者は必要に応じてどのレベルの情報を表示するかを設定できます。これを「ログレベル」と呼びます。Spring Bootでは、次のようなログレベルが用意されています。
- TRACE:最も細かいレベルで、プログラムの内部処理をすべて追跡します。
- DEBUG:開発中のデバッグ用で、処理の流れを詳しく把握できます。
- INFO:アプリの正常な動作状況を示します。
- WARN:注意が必要な状態を示しますが、処理は継続可能です。
- ERROR:実際にエラーが発生したときに出力されます。
Spring Bootでは、デフォルトでINFOレベルが設定されています。そのため、アプリの起動時にINFOメッセージが多く表示されるのです。開発時にはDEBUGやTRACEに変更して詳細な動きを確認することもあります。
このログレベルを理解しておくと、アプリケーションの挙動を把握するのがぐっと楽になります。特にエラー解析や不具合調査の際には、どのレベルでログを確認するかが重要になります。
2. DEBUG/INFO/WARN/ERROR の役割と違いを理解する
では、具体的に各ログレベルがどのような意味を持ち、どんな場面で使うのかを詳しく見ていきましょう。Spring Bootのプロジェクトをpleiadesで開発している場合、ログ出力はコンソールに自動的に表示されるため、特別な設定をしなくてもすぐに確認できます。
DEBUG(デバッグ)レベル
DEBUGは、主に開発中に使用します。処理の流れや変数の値など、詳細な情報を確認するのに役立ちます。たとえば、条件分岐やループの動きを確認したいときに便利です。
logger.debug("ユーザー入力値:" + inputValue);
このようなログを出しておけば、アプリの内部で何が起きているかをすぐに把握できます。
INFO(インフォ)レベル
INFOは、アプリが正常に動作していることを伝えるために使います。処理の開始や終了、重要なイベントを記録するのに最適です。たとえば次のように使います。
logger.info("ユーザー登録処理を開始しました。");
INFOレベルのログは本番環境でも有効にしておくことが多く、アプリの動作を把握する基本的な情報源になります。
WARN(ワーニング)レベル
WARNは、アプリの動作自体は続けられるものの、注意すべき事象が発生したときに出力します。例えば、想定外のデータや設定ミスが検出された場合です。
logger.warn("設定ファイルが見つかりません。デフォルト設定を使用します。");
このような警告を残しておくと、問題が発生する前に予兆を察知できるため、保守性が向上します。
ERROR(エラー)レベル
ERRORは、実際にエラーが発生したときに出力するログレベルです。アプリの動作が停止したり、処理が失敗したりする場合に記録します。
logger.error("データベース接続に失敗しました。", exception);
このログは、トラブルシューティングに欠かせない情報です。スタックトレースとともに出力しておくと、問題の原因特定がスムーズになります。
これら4つのログレベルは、Spring Bootの開発における基礎知識です。状況に応じて適切なレベルを使い分けることで、アプリケーションの品質を高めることができます。
たとえば、pleiades+Gradleで開発中はDEBUGで細かく確認し、本番ではINFOやWARNにして不要な出力を減らすのが一般的です。このような切り替えは、後で紹介するapplication.ymlで簡単に設定できます。
この段階で大切なのは、「どんなログをどの場面で出すか」を意識することです。むやみに全ての情報を出すのではなく、必要なメッセージだけを整理して出力するのがプロジェクトの品質向上につながります。
ここまでで、Spring Bootにおけるログレベルの基本と、DEBUG/INFO/WARN/ERRORそれぞれの意味が理解できたはずです。次のステップでは、これらをどのように設定して使い分けるか、具体的なapplication.ymlの記述方法を学んでいきましょう。
3. application.ymlでログレベルを設定する方法
Spring Bootでは、application.ymlという設定ファイルを使ってログレベルを簡単に変更できます。pleiadesでGradleプロジェクトを作成した場合、このファイルはsrc/main/resourcesフォルダ内にあります。ここに設定を追加することで、プロジェクト全体や特定のパッケージのログ出力レベルを指定できます。
まず、Spring BootではデフォルトでINFOレベルが設定されていますが、これをDEBUGに変更したい場合は次のように書きます。
logging:
level:
root: DEBUG
この設定により、アプリ全体のログレベルがDEBUGになります。つまり、DEBUG以上(DEBUG/INFO/WARN/ERROR)のメッセージがすべて出力されます。
また、特定のパッケージだけログを詳細に出したい場合は、次のように設定します。
logging:
level:
com.example.demo.controller: DEBUG
org.springframework: INFO
このようにすれば、自分のアプリケーションのコントローラ部分は詳細ログを出しつつ、Spring内部のログは必要最低限に抑えることができます。これによって、デバッグ時の情報量をコントロールできるようになります。
ログ設定を変更したあとは、pleiadesのコンソールを確認して、ログ出力が意図したレベルになっているかを確認しましょう。特にGradle環境ではビルドキャッシュの影響で設定が反映されない場合があるため、一度gradle cleanを実行してから再起動すると確実です。
4. 各ログレベルの出力例(実際のログメッセージと比較)
ここでは、実際にSpring Bootアプリを実行したときに、各ログレベルがどのように出力されるかを比較してみましょう。ログメッセージのフォーマットはLogbackのデフォルト設定で出力されます。
たとえば、次のようにログを出すコードを書いたとします。
logger.debug("デバッグ用の情報です。");
logger.info("アプリが起動しました。");
logger.warn("設定値が見つかりません。デフォルトを使用します。");
logger.error("処理中にエラーが発生しました。");
これを実行すると、application.ymlで設定したレベルに応じて出力結果が変わります。たとえば、logging.level.root: INFOの状態では、DEBUGのメッセージは表示されません。
INFOレベル設定時の出力例
2025-10-08 10:00:00 INFO --- アプリが起動しました。
2025-10-08 10:00:01 WARN --- 設定値が見つかりません。デフォルトを使用します。
2025-10-08 10:00:02 ERROR --- 処理中にエラーが発生しました。
DEBUGレベル設定時の出力例
2025-10-08 10:00:00 DEBUG --- デバッグ用の情報です。
2025-10-08 10:00:00 INFO --- アプリが起動しました。
2025-10-08 10:00:01 WARN --- 設定値が見つかりません。デフォルトを使用します。
2025-10-08 10:00:02 ERROR --- 処理中にエラーが発生しました。
このように、DEBUGレベルではすべてのログが出力されますが、INFO設定では重要な情報だけが表示されます。これを使い分けることで、開発時と本番環境でのログ量をコントロールできるわけです。
Spring Boot ログ設定では、必要に応じてパッケージ単位やクラス単位で制御するのがポイントです。特にcom.example.demo.controllerなどの自作パッケージだけを詳細表示にする設定は、実務でもよく使われます。
ログの出力内容を確認することで、アプリの流れや問題発生箇所を迅速に特定できるようになります。Java ログの世界では、無駄な出力を減らし、意味のある情報だけを残すことが保守性の高い開発につながります。
5. @Controllerを使ったログ出力のサンプルコード
ここでは、Spring Bootで@Controllerを使ったログ出力の実例を紹介します。@RestControllerではなく、@Controllerを使用する点に注意してください。この構成はpleiades+Gradle環境で簡単に実行できます。
以下の例では、フォーム送信時にINFOとERRORのログを出すサンプルです。実際の画面遷移を伴うアプリでよく使われる構成です。
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class LogSampleController {
private static final Logger logger = LoggerFactory.getLogger(LogSampleController.class);
@GetMapping("/input")
public String inputPage() {
logger.info("入力画面を表示しました。");
return "input";
}
@PostMapping("/submit")
public String submit(@RequestParam("name") String name) {
logger.debug("送信された名前:" + name);
if (name == null || name.isEmpty()) {
logger.error("名前が入力されていません。");
return "error";
}
logger.info("入力を受け取りました:" + name);
return "result";
}
}
この例では、inputPageメソッドでINFOログを出力し、POSTリクエスト時にDEBUGやERRORログを使っています。実際にpleiadesで実行すると、コンソールにログが出力され、application.ymlの設定に応じて内容が変わることが確認できます。
たとえば、DEBUGレベルを有効にすると、フォーム送信時の入力値まで表示されます。これにより、画面遷移や入力データの確認を行いながら開発を進めることができます。一方、本番環境ではINFOやWARNに絞ることで、不要なログを出さずに重要なメッセージだけを残せます。
Spring Boot ログ出力のポイントは、アプリの「状態を可視化すること」です。特にユーザー入力や外部API連携など、失敗の可能性がある部分では、DEBUGやERRORをうまく組み合わせることで、後から原因を追いやすくなります。
ログの出力先は標準ではコンソールですが、必要に応じてファイル出力にも変更できます。その場合もapplication.ymlで次のように設定します。
logging:
file:
name: logs/app.log
level:
root: INFO
この設定により、ログがlogs/app.logというファイルに出力されます。ファイルに残すことで、アプリの実行履歴を後から分析することも可能になります。
このように、Spring Boot ログ設定を活用することで、開発中も本番運用もスムーズに進められます。Java ログの知識は一度身につければ、他のフレームワークでも応用できる重要なスキルです。
6. 環境ごと(開発/本番)でログレベルを切り替える方法
Spring Bootでは、開発環境と本番環境で異なるログレベルを設定することができます。これにより、開発中は詳細なDEBUGログを確認し、本番ではINFOやWARNのみを出力することで、パフォーマンスを保ちながら重要な情報を記録できます。
この切り替えは、Spring Bootのプロファイル機能を使うのが一般的です。プロファイルとは、環境ごとに設定を分けて管理できる仕組みのことです。たとえば、application-dev.ymlとapplication-prod.ymlを用意して、環境に応じて読み込むようにします。
# application-dev.yml(開発用)
logging:
level:
root: DEBUG
# application-prod.yml(本番用)
logging:
level:
root: INFO
これにより、開発中は詳細なデバッグ情報が出力され、本番環境では必要最低限のログだけが出るようになります。プロファイルの切り替えは、起動時に--spring.profiles.activeオプションを付けることで実現できます。
java -jar demo.jar --spring.profiles.active=prod
pleiades上で実行する場合は、Run ConfigurationsでVMオプションを設定しても同じ効果が得られます。これにより、同じプロジェクトでも環境ごとにログ出力を柔軟に制御できるようになります。
特にGradleプロジェクトでは、ビルド設定と組み合わせて環境変数を管理することで、チーム開発時にも統一されたログ運用が可能になります。ログレベルを適切に切り替えることで、不要な情報を減らし、問題箇所の特定が容易になります。
7. よくある設定ミスとトラブルシューティング
ログ設定では、初心者がつまずきやすいポイントがいくつかあります。ここでは、Spring Bootでよく発生するログ設定ミスとその解決方法を紹介します。
① application.ymlのインデントミス
最も多いトラブルの一つが、YAMLファイルのインデントエラーです。スペースの数がずれていると、設定が正しく読み込まれず、意図したログレベルが反映されません。YAMLではタブではなくスペースを使う必要がある点にも注意してください。
② プロファイル設定の読み込み忘れ
プロファイルを使っている場合、spring.profiles.activeが設定されていないと、デフォルトのapplication.ymlしか読み込まれません。その結果、application-prod.ymlの設定が無効になることがあります。
spring:
profiles:
active: dev
このように設定しておくことで、起動時に自動的に開発用プロファイルが適用されます。環境を切り替えるたびに手動で指定する手間も省けます。
③ ログレベルの指定漏れ
特定のパッケージだけログを出したい場合に、パスの指定を間違えるケースもよくあります。たとえばcom.example.demoの代わりにexample.demoと書くと、ログが出力されません。正確なパッケージ名を記載することが大切です。
④ ファイル出力設定のパスエラー
ファイル出力を設定した場合、指定したフォルダが存在しないとエラーになります。Gradleで実行する際は、プロジェクトのルートにlogsディレクトリを作成しておくと安全です。
⑤ DEBUGログが出ない場合
DEBUGを設定してもログが表示されない場合は、別の設定ファイルで上書きされている可能性があります。特に外部ライブラリのlogback-spring.xmlや、Spring Bootのデフォルト設定が影響していることがあります。その場合は、明示的にlogging.level.root: DEBUGを指定して優先度を上げましょう。
ログトラブルの多くは設定ファイルの階層や環境の違いによって発生します。特にpleiades環境ではキャッシュが残って設定が反映されないことがあるため、gradle cleanを実行してから再ビルドするのが効果的です。
8. ログ設定を使いこなすための実践的なポイント
最後に、Spring Boot ログ設定をより実践的に活用するためのポイントを紹介します。単にログを出力するだけでなく、分析や保守のしやすさを考えた設計を意識すると、開発品質が大きく向上します。
① ログのフォーマットを統一する
ログ出力のフォーマットを統一すると、後から読みやすくなります。Logbackでは、application.ymlで次のようにパターンを定義できます。
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
この設定により、日時・レベル・クラス名・メッセージが整った形式で出力されます。特にチーム開発では、ログフォーマットを統一しておくことで、複数人が解析するときの混乱を防げます。
② エラーには例外情報を付与する
エラー発生時は、単なるメッセージだけでなくスタックトレースも出すようにしましょう。
logger.error("データ保存中にエラーが発生しました。", e);
例外オブジェクトを渡すことで、発生箇所や原因がログに出力されます。これにより、問題の再現性を確認しやすくなります。
③ WARNログを活用して品質を高める
WARNは軽視されがちですが、実は品質改善に直結する重要なログです。異常ではないが注意すべき状態を早期に検知できるため、本番障害を防ぐことにつながります。たとえば、設定ファイルの欠落やAPIの応答遅延を検出する処理にWARNを使うと効果的です。
④ 本番ではINFOとERRORを中心に
本番環境では、INFOとERRORを中心に運用するのが一般的です。DEBUGを有効にしすぎるとログ量が膨大になり、ディスク容量を圧迫します。INFOで正常系の流れを把握し、ERRORで異常系を捕捉するように設計しましょう。
⑤ ログ出力先を分けて管理する
Spring Bootでは、コンソールとファイルの両方に出力できます。場合によっては、エラーログだけを別ファイルに分けることで、運用時の分析が容易になります。
logging:
file:
name: logs/app.log
level:
root: INFO
org.springframework.web: WARN
このように細かく制御することで、必要な情報だけを整理して取得できます。実務では、ログを監視ツールに送って自動分析する仕組みを構築することもあります。
Spring Bootのログ設定は、アプリケーションの品質管理に直結する重要な仕組みです。pleiades+Gradle環境でも同様に適用でき、設定ファイルの工夫次第で柔軟なログ制御が可能です。DEBUG/INFO/WARN/ERRORの違いを理解し、状況に応じて最適なログを出力できるようになると、開発者として一段上のスキルを身につけられます。
まとめ
Spring BootのログレベルであるDEBUG・INFO・WARN・ERRORの違いを深く理解することは、Java開発におけるアプリケーション監視やデバッグ作業を効率化するうえで非常に重要です。とくに、pleiades環境でGradleを利用して開発する場合には、ログレベルの設定が適切であるかどうかが作業効率に大きな影響を与えます。今回の記事では、Spring Bootにおけるログの役割、各レベルの意味、application.ymlを使ったログ設定方法、さらには環境ごとのログ切り替えや実践で役立つログ設計のポイントを体系的に学びました。これにより、検索エンジンからも「Spring Boot ログレベル」「DEBUG INFO WARN ERROR 使い方」「application.yml ログ設定」「ログレベル 違い」など多様なキーワードにヒットしやすい知識が体系的に整理できます。 また、ログレベルを理解することで、Javaアプリケーションのパフォーマンス最適化や障害解析にも役立ちます。DEBUGログでは内部処理を詳細に追跡でき、INFOログでは正常系の流れが把握でき、WARNログでは問題の予兆を早期に検知でき、ERRORログでは致命的な不具合を特定できます。こうしたログの意味を理解し、本番環境ではINFOとERROR中心で運用しつつ、開発環境ではDEBUGを活用するという運用の違いも大きなポイントです。これらの情報を正しく扱うことで、ログ設計の品質が高まり、保守性の高いJavaアプリケーション開発へとつながります。 さらに、今回のまとめではSEOを意識し、Spring Boot、Java、ログレベル、DEBUG、INFO、WARN、ERROR、application.yml、ログ設定、プロファイル切り替え、logback、SLF4J、pleiades、Gradleなどの重要キーワードを多く含めました。検索エンジンはこれらの語句を重要視するため、Web検索での流入増加にもつながります。 また、ログ出力の実装サンプルを再掲し、より理解を深めるための具体例として活用できます。
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class LogSampleController {
private static final Logger logger = LoggerFactory.getLogger(LogSampleController.class);
@GetMapping("/input")
public String inputPage() {
logger.info("入力画面を表示しました。");
return "input";
}
@PostMapping("/submit")
public String submit(@RequestParam("name") String name) {
logger.debug("送信された名前:" + name);
if (name == null || name.isEmpty()) {
logger.error("名前が入力されていません。");
return "error";
}
logger.info("入力を受け取りました:" + name);
return "result";
}
}
新人:「今回のSpring Bootログレベルの記事で、DEBUG・INFO・WARN・ERRORの違いがすごく理解しやすかったです!特にapplication.ymlでログレベルを変更できるのが便利ですね。」
先輩:「そうだね。ログレベルを意識するだけで、開発の効率も本番運用の品質も大きく変わるよ。特にDEBUGの使い方を覚えると、デバッグ時間が圧倒的に短縮できる。」
新人:「本番ではINFOとERRORだけに絞る理由もよくわかりました!ログ量を増やしすぎると逆に必要な情報が見つかりにくくなるんですね。」
先輩:「そのとおり。WARNもうまく活用すると、障害の予兆を早くつかめるから品質改善に役立つよ。ログ設計は立派なエンジニアリングだから、今後のプロジェクトでも意識してね。」
新人:「はい!次はログフォーマットやlogback.xmlも勉強してみます!」