「Java」java.util.logging.Filter を使ってログ出力を制御する

java.util.logging.Filter インタフェース実装するといろいろ細かくログ出力が制御できるみたいです。ちょっと使ってみたので、その時のメモ。

・Filter (Java Platform SE 7 )
http://docs.oracle.com/javase/7/docs/api/java/util/logging/Filter.html

制御は以下の LogRecord 使って "メッセージ"、"ログレベル"、"ロガー名" とか、まぁ、いろいろ制御するみたいです。

・LogRecord (Java Platform SE 7 )
http://docs.oracle.com/javase/7/docs/api/java/util/logging/LogRecord.html


以下がサンプルになります。
MyFilter クラスが Filter の実装クラスです。作成した実装クラスを filter プロパティに指定してやると、フィルタが機能します。

■ TestFilter.java

package test;

import java.io.FileInputStream;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class FilterTest {

	private static LogManager logManager = LogManager.getLogManager();
	private static Logger logger = Logger.getLogger(FilterTest.class.getName());

	public static void main(String[] args) throws Exception {
		logManager.readConfiguration(new FileInputStream(
				"loggingFilter.properties"));

		logger.log(Level.SEVERE, "hoge");
		logger.log(Level.SEVERE, "uga");
	}
}

■ MyFilter.java

package test;

import java.util.logging.Filter;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	// メッセージに "hoge" を含む場合、ログ出力しない
	public boolean isLoggable(LogRecord record) {
		String message = record.getMessage();
		if (message.contains("hoge")) {
			return false;
		}
		return true;
	}

}

■ loggingFilter.properties

handlers= java.util.logging.ConsoleHandler
.level = FINEST

java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.filter = test.MyFilter

■ 実行結果

7 15, 2014 12:05:54 午前 test.FilterTest main
重大: uga

無事いけてますね。


あと、"ログレベル" と "ロガー名" で制御するサンプルは、以下の感じで。

■ ログレベルでフィルタする ( SEVERE の場合ログ出力しない )

package test;

import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	public boolean isLoggable(LogRecord record) {
		Level level = record.getLevel();
		if ("SEVERE".endsWith(level.toString())) {
			return false;
		}
		return true;
	}
}

■ ロガー名でフィルタする ( test.FilterTest の場合ログ出力しない )

package test;

import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	public boolean isLoggable(LogRecord record) {
		String name = record.getLoggerName();
		if (FilterTest.class.getName().endsWith(name)) {
			return false;
		}
		return true;
	}
}


以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 7 Update 45