「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; } }
以上です。