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メッセージ