java.util.loggingで採取するログの書式を変更する
java.util.loggingで採取するログの書式はlog4jのように設定ファイルに書式文字列を書くのとは違い、フォーマッタクラスを使用する。
フォーマッタクラスは通常$JAVA_HOME/jre/libの下に存在するプロパティファイル"logging.properties"に記述する。(Javaオプションでこれ以外のファイルを変更することもできる)
- logging.properties (抜粋)
############################################################ # Handler specific properties. # Describes specific configuration info for Handlers. ############################################################ # default file output is in user's home directory. java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter # Limit the message that are printed on the console to INFO and above. java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
それぞれログハンドラ毎にフォーマッタを指定できる。デフォルトではそれぞれXMLFormatter、SimpleFormatterが指定されているが、これを置き換えることでそれぞれのハンドラ毎に使われるフォーマッタを変えることができる。(デフォルトのフォーマッタはログレベルがローカライズされており、大きなお世話である。)
フォーマッタクラスは既存のFormatterクラスを継承して、formatメソッドをオーバライドするだけで独自の書式をログに適用できる。
package hoge public class MyFormatter extends Formatter { /* (non-Javadoc) * @see java.util.logging.Formatter#format(java.util.logging.LogRecord) */ @Override public String format(LogRecord record) { //recordを使って書式を編集 } }
formatメソッドの引数であるrecordにはログデータがレコードされているので、あとは必要な書式に編集して文字列で返すだけだ。
フォーマッタクラスが用意できたならば、デフォルトのと挿げ替えるためにプロパティファイルに記述する。
# Limit the message that are printed on the console to INFO and above. java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = hoge.MyFormatter
非常にシンプルな構成。Formatterクラスを外部から注入できるのも○。