読者です 読者をやめる 読者になる 読者になる
おもに Groovy やアジャイル開発について勉強していることを書き散らしてます。
わたしのひとりごとが、だれかのお役に立てればと…

Log4J で手動ローテーションしてみた

プログラミング

 
 
Log4J を使って、ログファイルを手動でローテーションできますか?」
という質問をもらった。

FileAppender 拡張したらなんとかなるはずと思いながら、ちょっと調べてみたら
RollingFileAppender なるクラスがあって手動ローテーションができることを発見。

以下、このサイトを参考にさせてもらいました。
http://www.nurs.or.jp/~sug/soft/log4j/log4j5.htm#sec7

サンプルつくってみた

動作環境はこんな感じ。

Java : 1.7
Log4J : 1.3alpha-8

GitHub にソースコード、アップしました。
よろしければ、どうぞ。
https://github.com/hideoku/RollingAppenderSample

本題の log4j.xml は以下のように書いた。

[sourcecode language="xml"]
<appender name="RollingAppender" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="file" value="sample.log" />
<param name="encoding" value="UTF-8" />
<param name="append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyyMMdd HHmmss} %m%n" />
</layout>

<triggeringPolicy class="org.apache.log4j.rolling.FilterBasedTriggeringPolicy">
<filter class="org.apache.log4j.filter.StringMatchFilter" >
<param name="StringToMatch" value="手動ローテーションするよ。" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.filter.DenyAllFilter" />
</triggeringPolicy>

<rollingPolicy class="org.apache.log4j.rolling.FixedWindowRollingPolicy">
<param name="FileNamePattern" value="rotated%i.log" />
<param name="MinIndex" value="1" />
<param name="MaxIndex" value="5" />
</rollingPolicy>
</appender>
[/sourcecode]

<appender> に RollingFileAppender クラスを指定して、
その子要素に <triggeringPolicy> と <rollingPolicy> を指定するのがポイント。

StringToMatch パラメータの値で、ローテーションのトリガーとなる文字列を指定する。

実行する Java はいつもどおり、トリガーとなる文字列をログ出力で指定する。

[sourcecode language="java"]
public class SampleRunner {

private static final Log logger = LogFactory.getLog(SampleRunner.class);

public static void main(String[] args) {
new SampleRunner().execute();
}

private void execute() {
logger.info("start execute()");

logger.info("ローテーション直前1");
logger.info("手動ローテーションするよ。");
logger.info("ローテーション直後1");

logger.info("ローテーション直前2");
logger.info("手動ローテーションするよ。");
logger.info("ローテーション直後2");

logger.info("end execute()");
}
}
[/sourcecode]

トリガー文字列はローテーション後の新しいファイルの方に含まれる。

ただし、1.3 のみ対応…

RollingFileAppender クラスは Log4J 1.3 でリリースされたクラス。
1.3 系は alpha リリースで、2006/02 から動きなしという状態。実案件への適用は難しいかも。

※1.2 系は先日(2012/05)、1.2.17 がひさびさにリリースされている。

Logback でも使える?

ということで、Logback にも同じような仕組みがあるか調べてみたら
ch.qos.logback.core.rolling.RollingFileAppender クラスがあった。

同じように使えるかどうかは調べていなけれど(たぶん使えるんだろう…)
実際に使うとしたらこちらかと。

今度ひまなときに Logback 版を試してみよう。