カテゴリ: Spring 更新日: 2025/11/19

Spring Bootでログを出力する基本(デフォルトの仕組み)

Spring Bootでログを出力する基本(デフォルトの仕組み)
Spring Bootでログを出力する基本(デフォルトの仕組み)

新人と先輩の会話形式で理解しよう

新人

「先輩、Spring Bootでログを出力する方法を知りたいんですが、設定が難しそうでよくわかりません…」

先輩

「いい質問だね。実はSpring Bootでは、最初からログ出力の仕組みが用意されていて、特別な設定をしなくてもログを出力できるんだよ。」

新人

「そうなんですね!ログってどんな場面で使われるんですか?」

先輩

「ログはアプリケーションの状態やエラーの発生を記録して、開発や運用中に問題を発見するために使うんだ。特にSpring Bootでは、LogbackSLF4Jというライブラリがデフォルトで使われているんだよ。」

新人

「LogbackとSLF4J…聞いたことはありますが、違いがわからないです。」

先輩

「それじゃあ、このあと詳しく説明していこう。」

1. Spring Bootでログを出力するとは?

1. Spring Bootでログを出力するとは?
1. Spring Bootでログを出力するとは?

Spring Bootでは、アプリケーションの動作状況やエラー情報を記録するために「ログ出力」を行います。ログは開発中のデバッグや運用監視に欠かせない情報源であり、プログラムがどのように動いたのかを追跡できます。

例えば、アプリケーションが正しく動いているか確認したい場合や、エラーが発生した原因を調べたいときにログはとても役立ちます。Spring Bootでは、特別な設定をしなくても起動時からログが自動的に出力されます。

Spring Bootのログは、デフォルトで「コンソール出力(標準出力)」に表示される仕組みです。これは開発環境で非常に便利で、エラー発生時のスタックトレース(例外の流れ)も一緒に確認できます。

例えば、Spring Bootを起動したときに次のようなログが自動で表示されます。


:: Spring Boot :: (v3.x.x)
2025-10-08T10:00:00.000+09:00  INFO 12345 --- [  main] c.example.demo.DemoApplication : Starting DemoApplication using Java 17
2025-10-08T10:00:01.234+09:00  INFO 12345 --- [  main] c.example.demo.DemoApplication : Started DemoApplication in 1.234 seconds

このように、Spring Bootではアプリ起動時から自動的にログが出力されるため、初心者でもログを扱いやすいのが特徴です。

2. Spring Bootのデフォルトのログ仕組み(Logback・SLF4Jについて)

2. Spring Bootのデフォルトのログ仕組み(Logback・SLF4Jについて)
2. Spring Bootのデフォルトのログ仕組み(Logback・SLF4Jについて)

Spring Bootのログ出力の仕組みは、SLF4J(Simple Logging Facade for Java)Logbackという2つのライブラリで構成されています。

SLF4Jは「ログの呼び出し窓口」を提供するインターフェースで、実際にログを出力するのはLogbackが担当します。つまり、SLF4Jが「ログを出す指令」を出し、Logbackが「実際にログを書き出す」という役割分担になっています。

Spring Bootをインストールした直後から、Logbackがデフォルトの実装として組み込まれているため、すぐにログを利用できます。追加の依存関係を設定する必要はありません。

実際にSpring Bootプロジェクトでログを出力するには、以下のようにLoggerを定義します。


package com.example.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class LogController {

    private static final Logger logger = LoggerFactory.getLogger(LogController.class);

    @GetMapping("/log")
    @ResponseBody
    public String showLog() {
        logger.info("Spring Boot ログ出力のテストです。");
        logger.debug("デバッグレベルのログも確認できます。");
        logger.error("これはエラーログの例です。");
        return "ログを出力しました。コンソールを確認してください。";
    }
}

このコードを実行すると、コンソールに次のようなログが出力されます。


2025-10-08T10:15:00.000+09:00  INFO 12345 --- [nio-8080-exec-1] c.e.demo.controller.LogController : Spring Boot ログ出力のテストです。
2025-10-08T10:15:00.001+09:00 DEBUG 12345 --- [nio-8080-exec-1] c.e.demo.controller.LogController : デバッグレベルのログも確認できます。
2025-10-08T10:15:00.002+09:00 ERROR 12345 --- [nio-8080-exec-1] c.e.demo.controller.LogController : これはエラーログの例です。

Spring Bootのログ出力は、LoggerFactoryを通じて呼び出す仕組みになっています。このため、どのクラスでも同じようにログを記録できます。

なお、ログの出力レベル(INFOやDEBUGなど)はapplication.propertiesで調整可能です。次の中盤の記事では、ログレベルや設定方法を詳しく解説していきます。

3. Spring Bootのログ出力設定を確認する方法(application.properties)

3. Spring Bootのログ出力設定を確認する方法(application.properties)
3. Spring Bootのログ出力設定を確認する方法(application.properties)

Spring Bootでは、ログ出力の設定をapplication.propertiesという設定ファイルで簡単に変更できます。このファイルは、プロジェクトのsrc/main/resourcesフォルダ内にあり、Spring Bootのさまざまな設定を記述できる場所です。

ログ出力に関しても、特別な設定ファイルを追加せずにこのapplication.propertiesで制御できるのがSpring Bootの便利な特徴です。ログレベルの変更や、どのパッケージのログをどのレベルで表示するかなどを自由に設定できます。

例えば、次のように書くと、全体のログレベルを「INFO」に設定し、アプリ全体で情報レベル以上のログが出力されるようになります。


logging.level.root=INFO

また、特定のパッケージに対してログレベルを指定することも可能です。例えば、自分のアプリケーションのパッケージだけをデバッグレベルで詳しく見たい場合は、次のように設定します。


logging.level.com.example.demo=DEBUG

このように設定すると、com.example.demo以下のクラスに対しては詳細なデバッグログが出力され、それ以外のフレームワーク部分はINFOレベルで表示されるようになります。これにより、必要な情報だけを確認でき、ログが見やすくなります。

さらに、Spring Bootではログの出力先を変更することもできます。デフォルトではコンソールに出力されますが、次のようにファイル出力を有効にすることもできます。


logging.file.name=app.log
logging.file.path=logs

上記の設定を追加すると、アプリケーション実行時にlogs/app.logというファイルが生成され、ログがファイルにも保存されるようになります。これにより、後から履歴を確認することも簡単になります。

4. ログレベルの理解(TRACE/DEBUG/INFO/WARN/ERROR)

4. ログレベルの理解(TRACE/DEBUG/INFO/WARN/ERROR)
4. ログレベルの理解(TRACE/DEBUG/INFO/WARN/ERROR)

Spring Bootでは、ログの重要度に応じて「ログレベル」が設定されています。ログレベルを理解することで、必要な情報だけを適切に出力できるようになります。代表的なログレベルは次の5種類です。

  • TRACE:最も詳細なログ。アプリケーション内部の細かい動作を追跡するときに使用します。
  • DEBUG:デバッグ用の情報。開発中の動作確認に便利です。
  • INFO:通常の動作情報。アプリケーションの起動や処理完了などを記録します。
  • WARN:警告レベルの情報。エラーではないが注意が必要な状況を示します。
  • ERROR:エラー発生時に出力。例外や処理失敗時に表示されます。

例えば、全体のログレベルをDEBUGに設定すると、DEBUG以上のすべてのログ(INFO、WARN、ERROR)も出力されます。しかし、INFOに設定すると、DEBUGやTRACEレベルの詳細な情報は出力されません。

ログレベルの調整は、開発中と本番環境で切り替えるのが一般的です。開発時にはDEBUGを使用して詳細を確認し、本番環境ではINFOWARNに設定して必要な情報だけを残すようにします。

Spring Bootでは、ログレベルを動的に変更することも可能で、アプリケーションを再起動せずに設定を反映できる仕組みもあります。この柔軟さがSpring Bootの大きな魅力です。

5. コントローラでログを出力してみよう(@Controller+@ResponseBody構成の例)

5. コントローラでログを出力してみよう(@Controller+@ResponseBody構成の例)
5. コントローラでログを出力してみよう(@Controller+@ResponseBody構成の例)

それでは、実際にSpring Bootのコントローラでログを出力してみましょう。今回は、@RestControllerを使わずに、@Controllerと@ResponseBodyを組み合わせてログを表示します。

以下は、pleiadesでGradleプロジェクトを作成した際のサンプルコード例です。この例では、ボタンをクリックするとログが出力される簡単な機能を実装しています。


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.ResponseBody;

@Controller
public class SampleLogController {

    private static final Logger logger = LoggerFactory.getLogger(SampleLogController.class);

    @GetMapping("/testlog")
    @ResponseBody
    public String testLog() {
        logger.trace("TRACEレベルのログです。詳細な動作を追跡します。");
        logger.debug("DEBUGレベルのログです。開発中のデバッグ情報を出力します。");
        logger.info("INFOレベルのログです。通常の動作情報を記録します。");
        logger.warn("WARNレベルのログです。注意が必要な状況を示します。");
        logger.error("ERRORレベルのログです。エラーが発生しました。");
        return "ログ出力テストが完了しました。コンソールを確認してください。";
    }
}

このコードを実行すると、ブラウザでhttp://localhost:8080/testlogにアクセスした際に、各ログレベルのメッセージがコンソールに出力されます。設定ファイルでlogging.level.root=DEBUGにしておけば、すべてのログレベルを確認できます。


2025-10-08T11:00:00.000+09:00 TRACE 12345 --- [nio-8080-exec-1] c.e.d.controller.SampleLogController : TRACEレベルのログです。詳細な動作を追跡します。
2025-10-08T11:00:00.001+09:00 DEBUG 12345 --- [nio-8080-exec-1] c.e.d.controller.SampleLogController : DEBUGレベルのログです。開発中のデバッグ情報を出力します。
2025-10-08T11:00:00.002+09:00  INFO 12345 --- [nio-8080-exec-1] c.e.d.controller.SampleLogController : INFOレベルのログです。通常の動作情報を記録します。
2025-10-08T11:00:00.003+09:00  WARN 12345 --- [nio-8080-exec-1] c.e.d.controller.SampleLogController : WARNレベルのログです。注意が必要な状況を示します。
2025-10-08T11:00:00.004+09:00 ERROR 12345 --- [nio-8080-exec-1] c.e.d.controller.SampleLogController : ERRORレベルのログです。エラーが発生しました。

このように、Spring Bootではapplication.propertiesでログレベルを設定し、コントローラ内でLoggerを呼び出すだけで簡単にログを出力できます。初心者でも少しずつ慣れていけば、ログを使って効率的にデバッグができるようになります。

次のセクションでは、ログ設定のよくあるミスや、デバッグ時の活用方法についてさらに詳しく解説していきます。

6. よくあるログ設定のミスと注意点(設定反映されない・出力されないなど)

6. よくあるログ設定のミスと注意点(設定反映されない・出力されないなど)
6. よくあるログ設定のミスと注意点(設定反映されない・出力されないなど)

Spring Bootでログ設定を行う際に、初心者がつまずきやすいポイントの一つが「設定したのにログが出ない」という現象です。実はこれは、設定ファイルの場所や記述方法のミスによって起こることが多いです。

まず最も多いのが、application.propertiesの配置場所が間違っているケースです。Spring Bootでは、このファイルは必ずsrc/main/resources配下に置かれている必要があります。もしresources直下以外に置いてしまうと、設定が反映されず、デフォルト設定のまま起動してしまいます。

もう一つのよくあるミスは、キー名のスペルミスです。例えば、logging.level.root=DEBUGと書くべきところをlogging.level.roootのように打ち間違えてしまうと、Spring Bootは正しく解釈できず、結果としてログレベルが変更されません。このような小さなミスでも、ログ出力が全く変わらないため、原因の特定に時間がかかることがあります。

また、ログファイルを出力しようとしてlogging.file.pathを設定した場合に、ディレクトリが存在しないとログが生成されないことがあります。事前にフォルダを作成しておくか、Spring Bootの実行ユーザーに書き込み権限があるかを確認しましょう。

さらに、複数の設定ファイルを使っている場合(application-dev.propertiesapplication-prod.propertiesなど)に、どのファイルが実際に読み込まれているかを確認することも大切です。Spring Bootでは、spring.profiles.activeで指定したプロファイルの設定が優先されるため、意図しない設定が反映されることがあります。

ログが出ない場合は、まずコンソールに「Using Logback for logging」と表示されているか確認しましょう。もし出ていなければ、Logbackが有効になっていない可能性があり、依存関係の破損や競合が疑われます。Gradle構成では、pleiadesの依存関係追加画面でLogbackが含まれているかもチェックしましょう。

7. デバッグ時にログを活用するコツ(エラー箇所の特定・処理の追跡)

7. デバッグ時にログを活用するコツ(エラー箇所の特定・処理の追跡)
7. デバッグ時にログを活用するコツ(エラー箇所の特定・処理の追跡)

開発中にアプリケーションの動作を確認する際、ログは最強のデバッグツールです。Spring Bootでは、デフォルトでDEBUGレベルのログを簡単に出せるため、エラーの原因追跡に非常に役立ちます。

まず基本として、例外発生時にはERRORレベルのログが出力されます。これを確認することで、どのクラスのどの行で例外が発生したのかを即座に特定できます。しかし、さらに詳しく処理の流れを知りたいときはDEBUGレベルを活用しましょう。たとえば、ユーザーのリクエストがどのコントローラに到達したか、内部のメソッドがどの順序で呼ばれているかを追跡することができます。

特に、複雑な処理を実装している場合や、データベースアクセス・外部API通信を行う際には、各ステップでlogger.debug()を挿入しておくと、処理の通過点を目で確認できます。これにより、想定通りに動作していない箇所を素早く発見できます。

例えば、コントローラ内でフォーム入力を受け取る処理をデバッグする場合、次のようにステップごとにログを追加すると効果的です。


@GetMapping("/checkUser")
@ResponseBody
public String checkUser(String name) {
    logger.debug("フォームから受け取った名前: " + name);
    if(name == null || name.isEmpty()) {
        logger.warn("名前が入力されていません。");
        return "名前を入力してください。";
    }
    logger.info("ユーザー確認処理を開始します。");
    // ここでサービスクラスの呼び出しなどを行う
    logger.debug("ユーザー確認処理が完了しました。");
    return "ユーザー情報を確認しました。";
}

このように、DEBUGINFOを使い分けることで、エラーが起こる前後の流れを正確に把握できます。特に「Spring Boot デバッグ」や「ログ追跡」といった観点では、ログを単なるメッセージ出力ではなく、プログラムの可視化手段として活用することが重要です。

また、Spring Bootの起動パラメータに--debugを付けて実行すると、内部の自動設定やBean登録の詳細な情報も確認できます。これは設定のトラブルを解決する際に非常に便利な機能で、初心者にもおすすめです。

8. 実践的なヒント(開発環境と本番環境のログ設定の違い)

8. 実践的なヒント(開発環境と本番環境のログ設定の違い)
8. 実践的なヒント(開発環境と本番環境のログ設定の違い)

Spring Bootでアプリケーションを開発する際には、「開発環境」と「本番環境」でログの設定を分けることがとても重要です。開発中はデバッグ情報を細かく出力したいですが、本番環境では不要な情報を出さず、必要なログだけを残すようにします。

例えば、開発環境ではapplication-dev.propertiesに次のように設定しておきます。


logging.level.root=DEBUG
logging.file.name=dev.log

これにより、デバッグ用のログがすべて出力され、開発中の問題を細かく把握できます。一方で、本番環境では次のようにapplication-prod.propertiesを設定します。


logging.level.root=INFO
logging.file.name=app.log
logging.file.path=/var/logs/myapp

このように、本番環境ではINFO以上のログに限定し、必要最低限の情報だけを残すようにします。特に「Spring Boot 本番環境 ログ設定」の観点では、ログファイルの肥大化を防ぐためにローテーション設定を行うことも大切です。logback-spring.xmlを利用すると、一定期間ごとに古いログを自動削除する設定も可能です。

また、本番環境では個人情報や機密情報を誤ってログに出力しないよう注意が必要です。たとえば、ユーザー名やメールアドレス、トークンなどをそのままlogger.debug()で出してしまうと、後にトラブルの原因になります。必ずマスク処理やフィルタリングを行いましょう。

開発中はpleiadesでアプリを実行してリアルタイムにコンソールを確認し、本番環境ではファイル出力をメインにするという運用が一般的です。この切り替えを上手く使い分けることで、開発効率と運用の安定性の両方を実現できます。

最後に、ログ設定を変更した際は必ずアプリを再起動して反映を確認してください。設定が反映されていない場合は、プロファイルが正しく指定されているか、Gradleのビルドが最新になっているかを見直すとよいでしょう。

Spring Bootのログ出力は、シンプルながら非常に柔軟です。デフォルトの仕組みを理解しておけば、トラブル時にも冷静に原因を追えるようになります。ログを「ただの記録」ではなく「開発者の目」として活用することが、安定したアプリケーション運用の第一歩です。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
JDBCとは?Javaでデータベースを使うしくみを初心者向けに解説
Springと他のフレームワーク(StrutsやJSF)との違いを初心者向けにわかりやすく解説!
Springのモジュール構成(DI・AOP・MVCなど)を紹介
Javaの論理演算子(&&, ||, !)の使い方を学ぼう
人気記事
No.1
Java&Spring記事人気No1
単体テストと結合テストの違いを理解しよう
No.2
Java&Spring記事人気No2
Javaとは?初心者向けにやさしく解説
No.3
Java&Spring記事人気No3
SQLのサブクエリを完全ガイド!入れ子クエリの使い方を初心者向け解説
No.4
Java&Spring記事人気No4
SQLのトリガー(TRIGGER)を完全ガイド!初心者でもわかる自動処理の仕組み