FileAppender 動的にログファイル名を変える

通常logbackでFileAppenderやRollingFileAppenderを使う際に
ファイル名はfile項目へ設定する必要がある。
しかしこの場合ログファイル名は固定となる。

動的にログファイル名を変更したい場合について紹介したいと思う。
ここではRollingFileAppenderで日次ローテーション(TimeBasedRollingPolicy)する場合。

単純に言うと、 RollingFileAppenderTimeBasedRollingPolicy
継承したクラスを作成すれば良い。
そしてコンストラクタでファイル名を設定してあげればいいだけ。

MyRollingFileAppenderクラス

package log.logback;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TriggeringPolicy;

public class MyRollingFileAppender extends RollingFileAppender<TriggeringPolicy<ILoggingEvent>>{

    public MyRollingFileAppender(){
        super();
        setFile(getFileName());
    }

    private String getFileName(){
        // ここでファイル名を作成する.
        return "log/testFile.log";
    }
}

MyTimeBasedRollingPolicyクラス

package log.logback;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;

public class MyTimeBasedRollingPolicy extends TimeBasedRollingPolicy<ILoggingEvent> {

    public MyTimeBasedRollingPolicy(){
        super();
        setFileNamePattern(getPattern());
    }

    private String getPattern(){
        // ここでファイル名パターンを作成する.
        return "log/testFile.log.%d{yyyy-MM-dd}.log";
    }
}

※packageは任意。

コンストラクタでRollingFileAppenderではsetFile(String)、TimeBasedRollingPolicyではsetFileNamePattern(String)で設定する。

これら独自クラスをlogback.xmlで使用するようにすればOK。

<configuration>

   <appender name="FILE" class="log.logback.MyRollingFileAppender">
   <!--
   <file>logFile.log</file>
   -->
   <rollingPolicy class="log.logback.MyTimeBasedRollingPolicy">
     <!-- daily rollover -->
     <!--
     <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
     -->
     <!-- keep 30 days worth of history -->
     <maxHistory>30</maxHistory> 
   </rollingPolicy>

   <encoder>
     <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
   </encoder>
 </appender> 

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

ちなみにmaxHistoryもTimeBasedRollingPolicy#setMaxHistory(int)が存在するので、動的に変更可能。
# version 0.9.29ではコンストラクタは1つだけだが、今後コンストラクタが増えた場合はその分同じコンストラクタを作成したほうが無難。

また、この記事ではgetFileName()やgetPattern()メソッドを作成したが、もし別の名前で作成する場合は、
意図しない@Overrideをしないよう注意したい。