java.util.loggingはもちょっとなんとかならんのか

ここ数日はがむしゃらにコーディングしているが、そうするとあちこちの使えないライブラリに対する怒りが溜まって困る。


今日のそれはjava.util.logging。過去何度も怒りを溜めては忘れ溜めては忘れしたが、今日は書いて発散する。
まず明らかにバカなのが、次のように例外をログするのは頻出のパターンなのに適切なオーバーロードが存在しないこと。

catch(SomeException e) {
    LOGGER.severe("Houston, we have a problem",e);
}

かわりにより冗長な次の構文が必要。

catch(SomeException e) {
    LOGGER.log(LogLevel.SEVERE,"Houston, we have a problem",e);
}

同様にメッセージのフォーマットをする場合にも

LOGGER.info("Operation {0} failed for {1}",opName,reason);

とかしたいのにそんなオーバーロードはなく

LOGGER.log(LogLevel.INFO,"Operation {0} failed for {1}",opName,reason);

としなくてはならず、しかもvarargに対応していないためにJDK5でも次のように書かざるをえない。

LOGGER.log(LogLevel.INFO,"Operation {0} failed for {1}",new Object[]{opName,reason});

この他にもコマンドラインからログの設定をするのが死ぬ程面倒とか名前なしのLoggerで任意のツリー構造を作れないとか色々デザイン上の問題もあるけど、こういう基本的なところは何とかして欲しい。


JSRのページを見ると、2002年にリリースしてから一回もメンテナンス・レビューされてない。Danny CowardはJDK7で忙しいだろうからバグをファイルしてもメンテナンス・レビューされる見通しは低い感じ。JavaSEの人達はログを取るという習慣が全然ないので(実際JDKの中でロギングしているコードがあるだろうか)、こっちから文句を言っても痛痒を感じないので困る。


ソフトウェアには不断のメンテナンスが必要なのに(cvsだって未だにメンテナンスされてるのに!)、作りっぱなしではどんなものでもダメという好例。折角標準になってcommons-loggingのクラスローダー問題から逃れられると思いきやこれだよ。