CompositeRollingFileAppenderのコンパイル
CompositeRollingFileAppenderのコンパイル例を以下に示します。
javac -classpath log4j-1.2.13.jar -d classessrc/org/apache/log4j/CompositeRollingFileAppender.java
コンパイルを実行すると2つのクラスファイルが生成されます(1つは内部クラスです)。
アプリケーションへの組み込み方法
サンプルファイルには上記のソースファイル「CompositeRollingFileAppender.java」および、そのソースをコンパイルしてできるクラスファイルを「log4j-1.2.13.jar」に加えた、「log4j-1.2.13-ext.jar」などが格納されています。
CompositeRollingFileAppenderを利用する場合は「log4j-1.2.13-ext.jar」をシステムのクラスパスに加えてください(log4j-1.2.xx.jarは加える必要ありません)。
なお、「log4j.xml」(もしくは「log4j.properties」)をLog4jの設定ファイルとして読み込ませるには、実行時のクラスパスに含める方法が簡単でしょう。以下に、サンプルアプリケーションを実行するためのコマンド例を示します(「log4j.xml」は「classes」フォルダに格納されているものとします)。
java -cp classes;lib/log4j-1.2.13-ext.jarjp.co.okisoft.esc.log4j.RollingSample
サンプル実行
サンプルファイルに含まれる「run.bat」を実行すると、「log」フォルダにログファイルが生成され、サイズと日付によるローテーションの様子を確認できます(サンプルの「log4j.xml」ではローテーションの様子を早く確認するために、MaxFileSizeを「10KB」、MaxBackupIndexを「10」、DatePatternを「'.'yyyy-MM-dd-HH-mm」として、分単位でローリングを行う設定にしてあります)。
実行確認
「log」フォルダには、例えば次のようなログファイルが生成されます。

サイズベースのローテーション
サイズベースのローテーションが発生すると、日付が付けられていないログファイルを対象としてローテーションを行います。例えば、以下のログファイルが出力されている状態でサイズベースのローテーションが発生すると、

次のようにローテーションされます。

ローテーションによってファイル名が変更されたファイルを赤の点線で囲っています。サイズベースのローテーションではファイル名末尾の「Index」が1づつ増えます。ですので、Indexが大きいほど古いファイル、Indexが付いていないファイル(この例では「sample.log」)が一番新しいファイルということになります。
日付ベースのローテーション
日付ベースのローテーションでも、日付が付けられていないログファイルを対象としてローテーションを行います。例えば、以下のログファイルが出力されている状態で日付ベースのローテーションが発生すると、

次のようにローテーションされます。

MaxBackupIndexに基づくログファイルの削除
ローテーションによりバックアップログファイル数がMaxBackupIndexを超えた場合は、最も古いログファイルが削除されます。例えば、以下のログファイルが出力されている状態でサイズベースのローテーションが発生すると、

最も古いログファイル(「sample.log.2006-07-24-22-48」)が削除され、その後サイズベースのローテーションが行われて、ログファイルは次のようになります。

まとめ
既存のRollingFileAppenderとDailyRollingFileAppenderを組み合わせて、サイズと日付でローテーションするAppenderについて紹介しました。
本稿執筆のきっかけになったのは、開発現場からの要求でした。サイズと日付でローテーションするAppenderについて調べてみると、Log4j 1.2.13の媒体にKevin Steppe氏によるAppenderが寄贈されているのを知りました。
ですがそのAppenderも開発現場の要求を完全に満たすものではなかったため、RollingFileAppenderとDailyRollingFileAppenderをベースに新規にAppenderを作成し、この記事を執筆するに至っています。
本Appenderの作成において、Kevin Steppe氏のAppenderがとても参考になったことを付け加えておきます。
本稿執筆時点ではまだ正式リリースされていませんが、Log4j 1.3がもうじきリリースされると思います(2006/10/02現在、Log4j 1.3 alpha-8)。Log4j 1.3ではローテーションの仕組みが改善されていますが、それでも本稿で紹介したローテーションを実現するには、独自の作りこみが必要になるようです。
開発現場の要求はさまざまで今後こういった独自のAppenderを作成する必要が出てくるかもしれません。その場合に、この記事が参考になれば幸いです。
参考資料
- Apache Logging Services Project Log4J(本家のページ)
- Log4j Q&A(筆者が管理しているページで、他の参考文献も紹介しています)

src/org/apache/log4j/CompositeRollingFileAppender.java