Logbackアペンダー徹底解説

docs

みんな、こんにちは! 前回はLogbackの導入と基本的な設定について学んだよね(まだの人はここからチェックしてね! LogbackでJavaアプリのログをもっと見やすく! – Hello Java World)。今回は、Logbackの肝となる「アペンダー」について、もっと詳しく見ていこう!

アペンダーって何だっけ? アペンダーは、ログメッセージをどこに出力するか(出力先)を決めるものだよ。例えば、コンソールに出したり、ファイルに保存したり、データベースに送ったり…って感じ。Logbackには色々な種類のアペンダーが用意されているんだ。今回はよく使うアペンダーをいくつかピックアップして紹介していくよ。

1. ConsoleAppender (コンソールに出力)

一番シンプルで分かりやすいのが ConsoleAppender だね。プログラムを実行しているターミナルやIDEのコンソールにログを出力してくれるんだ。開発中にデバッグ情報を確認するのにめちゃくちゃ便利!

設定例 (logback.xml):

XML

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

encoder の中の pattern で、ログの出力フォーマットを細かく指定できるよ。

  • %d{HH:mm:ss.SSS}: 時刻(時:分:秒.ミリ秒)
  • [%thread]: ログを出力したスレッド名
  • %-5level: ログレベル(DEBUG, INFO, WARN, ERRORなど)。-5 は左詰め5文字で表示って意味。
  • %logger{36}: ロガーの名前。{36} は最大36文字で表示って意味。
  • %msg: ログメッセージ本体
  • %n: 改行

Javaコード例:

Java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConsoleAppenderExample {
    private static final Logger logger = LoggerFactory.getLogger(ConsoleAppenderExample.class);

    public static void main(String[] args) {
        logger.debug("これはデバッグログです。");
        logger.info("これは情報ログです。");
        logger.warn("これは警告ログです。");
        logger.error("これはエラーログです。");
    }
}

実行結果:

22:00:00.123 [main] DEBUG c.q.l.ConsoleAppenderExample - これはデバッグログです。
22:00:00.123 [main] INFO  c.q.l.ConsoleAppenderExample - これは情報ログです。
22:00:00.123 [main] WARN  c.q.l.ConsoleAppenderExample - これは警告ログです。
22:00:00.123 [main] ERROR c.q.l.ConsoleAppenderExample - これはエラーログです。

※上記時刻は実行時の実際の時刻に依存します。

2. FileAppender (ファイルに出力)

ログをファイルに保存したい場合は FileAppender を使うよ。プログラムが動いている間ずっとログを取り続けたい、後からログを解析したい、なんて時に大活躍するよ。

設定例 (logback.xml):

XML

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logs/mylog.log</file> <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

<file> タグでログファイルのパスを指定するよ。ここでは logs ディレクトリの下に mylog.log という名前でファイルが作成されるんだ。

Javaコード例:

Java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileAppenderExample {
    private static final Logger logger = LoggerFactory.getLogger(FileAppenderExample.class);

    public static void main(String[] args) {
        logger.debug("このデバッグログは出力されません (root levelがinfoのため)。");
        logger.info("このログはファイルに出力されます。");
        logger.warn("警告ログもファイルに出力されます。");
    }
}

実行結果:

(logs/mylog.log というファイルが作成され、その中に以下の内容が書き込まれる)

2025-06-23 22:00:00.123 [main] INFO  c.q.l.FileAppenderExample - このログはファイルに出力されます。
2025-06-23 22:00:00.123 [main] WARN  c.q.l.FileAppenderExample - 警告ログもファイルに出力されます。

※上記時刻は実行時の実際の時刻に依存します。

root levelinfo になってるから、debug レベルのログは出力されないことに注意してね。

3. RollingFileAppender (ローリングファイルに出力)

FileAppender のままだと、ログファイルがどんどん大きくなっちゃうよね。特にシステムを長時間動かす場合、ディスクがいっぱいになっちゃうなんてことも…そこで便利なのが RollingFileAppender だよ! これは、ログファイルが一定のサイズを超えたり、日付が変わったりすると、新しいログファイルを作成してくれるんだ。古いファイルは自動的にアーカイブ(圧縮)されたり、削除されたりする設定もできるから、ディスク容量を効率的に使えるんだ。

RollingFileAppender は、ローリングの条件によっていくつか種類があるけど、ここではよく使われる日付ベースとサイズベースのローリングを紹介するね。

3-1. TimeBasedRollingPolicy (時間ベースのローリング)

日付が変わるごとに新しいログファイルを作成するよ。

設定例 (logback.xml):

XML

<configuration>
    <appender name="DAILY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/daily.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/daily.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="DAILY_FILE" />
    </root>
</configuration>
  • <file>: 現在のログファイル名(ローリングされていないファイル名)。
  • <fileNamePattern>: ローリングされたファイルの命名規則。%d{yyyy-MM-dd} で日付が入るよ。
  • <maxHistory>: 過去何日分のログファイルを保持するか。ここでは30日分。

Javaコード例:

Java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TimeBasedRollingExample {
    private static final Logger logger = LoggerFactory.getLogger(TimeBasedRollingExample.class);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 5; i++) {
            logger.info("時間ベースのログテスト #" + i);
            Thread.sleep(1000); // 1秒待つ
        }
    }
}

実行結果:

logs/daily.log が作成され、日付が変わると logs/daily.2025-06-23.log のように新しいファイルが作成される。daily.log は常に最新のログが書き込まれる。)

// logs/daily.log の内容例
22:00:00.123 [main] INFO  c.q.l.TimeBasedRollingExample - 時間ベースのログテスト #0
22:00:01.123 [main] INFO  c.q.l.TimeBasedRollingExample - 時間ベースのログテスト #1
// ...

※上記時刻は実行時の実際の時刻に依存します。

3-2. SizeAndTimeBasedRollingPolicy (サイズと時間ベースのローリング)

ファイルサイズが一定を超えた場合、または日付が変わった場合に新しいログファイルを作成するよ。これは、時間とサイズのどちらかの条件が満たされた場合にローリングが行われるんだ。

設定例 (logback.xml):

XML

<configuration>
    <appender name="SIZE_TIME_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/sizetime.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/sizetime.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize> <maxHistory>7</maxHistory>      <totalSizeCap>1GB</totalSizeCap> </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="SIZE_TIME_FILE" />
    </root>
</configuration>
  • <fileNamePattern>: %i は、同じ日に複数のローリングが発生した場合にインデックス番号が入るよ。
  • <maxFileSize>: 1つのログファイルの最大サイズ。ここでは10MB。
  • <totalSizeCap>: 全てのアーカイブされたログファイルの合計サイズの上限。この上限を超えると、古いファイルから削除される。

Javaコード例:

Java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SizeAndTimeBasedRollingExample {
    private static final Logger logger = LoggerFactory.getLogger(SizeAndTimeBasedRollingExample.class);

    public static void main(String[] args) {
        for (int i = 0; i < 10000; i++) { // たくさんログを出力してサイズを増やす
            logger.info("サイズと時間ベースのログテスト。これは" + i + "番目のログです。");
        }
    }
}

実行結果:

logs/sizetime.log が作成され、ファイルサイズが10MBを超えるか、日付が変わると logs/sizetime.2025-06-23.0.log のように新しいファイルが作成される。さらにサイズを超えると logs/sizetime.2025-06-23.1.log のようにインデックスが増えていく。)

// logs/sizetime.log またはローリングされたファイルの内容例
22:00:00.123 [main] INFO  c.q.l.SizeAndTimeBasedRollingExample - サイズと時間ベースのログテスト。これは0番目のログです。
// ...
22:00:00.456 [main] INFO  c.q.l.SizeAndTimeBasedRollingExample - サイズと時間ベースのログテスト。これは9999番目のログです。

※上記時刻は実行時の実際の時刻に依存します。

まとめ

今回はLogbackのアペンダーについて、特に利用頻度の高い ConsoleAppenderFileAppenderRollingFileAppender(時間ベースとサイズベース)を中心に見てきたね。

アペンダーを使いこなせると、ログの管理が格段に楽になるし、問題発生時の原因究明もスムーズになるよ。ログの出力先や保存期間、ファイルサイズなどを適切に設定して、快適なログライフを送ってね!

次回は、Logbackのフィルターについて詳しく見ていく予定だよ。お楽しみに! (次回の記事はこちらから! https://moritama321.hatenablog.com/

コメント

タイトルとURLをコピーしました