Log4Jでファイルを動的に切り替える

ユーザーの指定によって出力先を変えたりするとき。
とりあえず、ファイルを閉じれないとファイルの書き込みが完了しなかったり、ファイルをにぎりっぱなしになったりするので、closeFileを呼び出してファイル閉じたいのだけど、protectedなので、継承してpublicにする。

public class ClosableFileAppender extends FileAppender{
    @Override
    public void closeFile() {
        super.closeFile();
    }

    @Override
    public void activateOptions() {
    } 
}


このAppenderをプロパティファイルで指定しつつ操作するためには、確実に取得できるloggerを用意しておく。

log4j.logger.myapplog = INFO, file  #本来の出力指定

log4j.logger.fileholder = FATAL, file  #ファイルを保持しておくため

log4j.appender.file=ClosableFileAppender # appenderの設定
log4j.appender.file.layout=org.apache.log4j.SimpleLayout


あとは、出力時にこんなことを書いておく

ClosableFileAppender cfa = null;
Appender appender = Log.fileholder.getAppender("file");
if(appender instanceof ClosableFileAppender){
    cfa = ((ClosableFileAppender)appender);
    cfa.closeFile();
    cfa.setFile("C:\user\kishida\data\log.txt", false, true, 1024);
}

// ログ出力のある処理を行う

cfa.closeFile();


けど、こんなことが必要になる状況って普通はなさげだな〜