Log4J で手動ローテーションしてみた
「Log4J を使って、ログファイルを手動でローテーションできますか?」
という質問をもらった。
FileAppender 拡張したらなんとかなるはずと思いながら、ちょっと調べてみたら
RollingFileAppender なるクラスがあって手動ローテーションができることを発見。
以下、このサイトを参考にさせてもらいました。
http://www.nurs.or.jp/~sug/soft/log4j/log4j5.htm#sec7
サンプルつくってみた
動作環境はこんな感じ。
GitHub にソースコード、アップしました。
よろしければ、どうぞ。
https://github.com/hideoku/RollingAppenderSample
[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 版を試してみよう。