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クラスを外部から注入できるのも○。