java.util.loggerはJava Web Startでは使えない
ログ出力時のフォーマッタを独自のフォーマッタクラス"com.hoge.log.formatter.HogeDefaultFormatter"で実装し、logging.propertiesを以下のように変更し、クラスパス上(config/)に配置する。
handlers=java.util.logging.FileHandler,java.util.logging.ConsoleHandler .level= INFO java.util.logging.FileHandler.pattern = /application%g.log java.util.logging.FileHandler.limit = 100000 java.util.logging.FileHandler.count = 5 java.util.logging.FileHandler.formatter = com.hoge.log.formatter.HogeDefaultFormatter java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = com.hoge.log.formatter.HogeDefaultFormatter com.hoge = INFO
コードでは以下のように、スタティックコンストラクタでlogging.propertiesの設定を反映することで
static { ClassLoader cl = Thread.currentThread().getContextClassLoader(); InputStream ins = cl.getResourceAsStream("config/logging.properties"); try { try { LogManager man = LogManager.getLogManager(); man.readConfiguration(ins); } finally { ins.close(); } } catch (IOException e) { e.printStackTrace() } }
ロガーのデフォルトのフォーマッタを切り換えることができるのだが(デフォルトはなぜかXML形式のログを吐くフォーマッタが採用されている。ツールで読むことを前提にしたのだろうか)、通常のアプリケーションでは正常に動作するのに、Java Web Startから起動すると、上記のコードでフォーマッタを換えたようでも実際には元の(jreの規定値?)フォーマッタが使われてしまう現象を確認している。※
あと、何より嫌なのがFileHandlerクラスのパターンプロパティで
java.util.logging.FileHandler.pattern = /application%g.log
と、カレントディレクトリにログを出力する設定にした場合、Java Web Start経由で起動したのだから、同アプリケーションがキャッシュされるロケーションにログが出力されるのかと思いきや、現在アプリケーションが実行されているパスを基準に出力しようとすることだ。
デフォルトで使われるフォーマッタが嫌だからわざわざ換えているのに、この振る舞いでは意味が無い。
※無論、Javaコントロールパネルではログの出力を有効にしている。