log4jのDailyRollingFileAppenderでMaxBackupIndexを使う方法

こんにちは、堀部です。

RollingFileAppenderにはバックアップファイル数の最大値を指定するMaxBackupIndexプロパティがありますが、DailyRollingFileAppenderではMaxBackupIndexは使えません。

そこでDailyRollingFileAppenderでも古いログファイルを削除できるようにAppenderを作成したいと思います。

対象バージョン

今回使用したバージョンは以下の通りです。

Java
1.8
log4j
1.2.14

Appenderを自作する

DailyRollingFileAppenderの場合は日付でローテーションしますので、MaxBackupIndexで指定する値は保存する日数(3を指定すると3日前以前のファイルを削除する)とします。

以下のサイトのソースをコピペすれば基本的には作成できますが、そのままですと(当日-MaxBackupIndex)日の1日のみしか削除されないため、それ以前のファイルも削除するように修正します。

https://wiki.apache.org/logging-log4j/DailyRollingFileAppender

rollOver()の372行目以降に以下を追加します。

	// ログファイル名を取得する
	String orgFileName = new File(fileName).getName();

	// ログ格納ディレクトリからバックアップファイルを取得する
	File dir = new File(new File(fileName).getParent());
	File[] files = dir.listFiles(new FilenameFilter() {
		@Override
		public boolean accept(File dir, String name) {
			// ファイル名の末尾が日付のファイルのみ
			return name.matches(orgFileName + ".[-.0-9]+$");
		}
	});
	Date targetDate = new Date(rpc.getPastCheckMillis(new Date(), maxBackupIndex));
	for(File oldFile : files){
		try {
			String strDate = oldFile.getName().replace(orgFileName, "");
			Date date = sdf.parse(strDate);
			// 基準日より過去のバックアップファイルを削除する
			if(targetDate.compareTo(date) > 0) {
				if (oldFile.exists()) {
					oldFile.delete();
				}
			}
		} catch (ParseException e) {
		}
	}

ライブラリをjarにする

ライブラリのjarを展開してコンパイルしたclassファイルで上書き、再度jarを作成すれば完了です。

コマンド例

javac -cp log4j-1.2.14.jar log4j-1.2.14-sources\org\apache\log4j\DailyMaxRollingFileAppender.java
jar cvf log4j-1.2.14.jar .
jar cvf log4j-1.2.14-sources.jar .

まとめ

いかがでしたでしょうか。

溜まり続けるログファイルに対しては何らかの対処が必要になりますが、log4jで完結できるのは非常にありがたいですね。

記事をシェア
MOST VIEWED ARTICLES