標準ロギングは使いやすいのは常識かと思ってたけど

http://d.hatena.ne.jp/nowokay/comment?date=20080723#c

プロパティファイルでカテゴリごとに出力先を切り替えれて、独自パターンで出力形式が指定できるフォーマッタがあれば、java.util.loggingでいいんだけども

個人的には標準ロギングは使いやすいと思ってるけど.カスタムも容易で覚えることが少ないし.出力先はログハンドラを返ればいいし,フォーマットはログフォーマッタをかえればいいだけ.

package logtest;

import java.io.IOException;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import logtest2.LogTest2;

public class LogTest1 {

    public LogTest1(){
        Logger logger = Logger.getLogger(this.getClass().getCanonicalName());

        System.err.println("######## LogTest1");
        logger.info("infoメッセージ");
        logger.fine("fineメッセージ");
        logger.warning("warningメッセージ");
    }

    public static void main(String... args) throws IOException {
 
        System.err.println("######## 設定ファイル読み込み");
        LogManager.getLogManager().readConfiguration(
                LogTest1.class.getResourceAsStream("/logtest/hoge.properties"));
        
        new LogTest1();

        new LogTest2();

    }
}
package logtest2;

import java.util.logging.Logger;

public class LogTest2 {
    public LogTest2(){
        Logger logger = Logger.getLogger(this.getClass().getCanonicalName());

        System.err.println("######## LogTest2");
        logger.info("infoメッセージ");
        logger.fine("fineメッセージ");
        logger.warning("warningメッセージ");
    }
}

プロパティファイル

#ハンドラの設定
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = logtest.formatter.HogeFormatter

#ログフォーマット文字列
#1:日付 2:タイプ 3:クラス 4:メソッド 5:メッセージ 
logtest.formatter.HogeFormatter.format = %1$tF %1$tT [%2$s] %3$s %4$s : %5$s %n

#logtest〜が対象
logtest.handlers = java.util.logging.ConsoleHandler
logtest.level = INFO

#logtest2〜が対象
logtest2.level = WARNING
logtest2.handlers = java.util.logging.ConsoleHandler

カスタムフォーマッタ

package logtest.formatter;

import java.util.logging.Formatter;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;

public class HogeFormatter extends Formatter{
    private String format;
    public HogeFormatter() {
        format = LogManager.getLogManager().getProperty(this.getClass().getName()+".format");
    }

    @Override
    public String format(LogRecord record) {
        return String.format(format , 
                record.getMillis() ,
                record.getLevel().getName(),
                record.getSourceClassName(),
                record.getSourceMethodName(),
                record.getMessage()
                );
    }

}

5分くらいで書いたコードなので適当だけれども,開発時ならばこんなので十分かと.printfのフォーマットをそのまま使うという手抜きさ全開だけど.

実行結果

init:
deps-jar:
compile:
run:
######## 設定ファイル読み込み
######## LogTest1
2008-07-24 20:25:25 [INFO] logtest.LogTest1 : infoメッセージ
2008-07-24 20:25:25 [WARNING] logtest.LogTest1 : warningメッセージ
######## LogTest2
2008-07-24 20:25:25 [WARNING] logtest2.LogTest2 : warningメッセージ