みんな、こんにちは! 前回は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 level が info になってるから、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のアペンダーについて、特に利用頻度の高い ConsoleAppender、FileAppender、RollingFileAppender(時間ベースとサイズベース)を中心に見てきたね。
アペンダーを使いこなせると、ログの管理が格段に楽になるし、問題発生時の原因究明もスムーズになるよ。ログの出力先や保存期間、ファイルサイズなどを適切に設定して、快適なログライフを送ってね!
次回は、Logbackのフィルターについて詳しく見ていく予定だよ。お楽しみに! (次回の記事はこちらから! https://moritama321.hatenablog.com/)


コメント