log5j

googleからlog5jなるものがリリースされていた。単にGoogle Codeで公開しているだけっぽい。log5jという名前からGoogle発だと勘違いしていまいました。spinn3rという会社の作みたいです(2010.2.24)。
http://code.google.com/p/log5j/


オレオレ翻訳で概要を。勝手に追記したりしてますので、その辺の差異は原文を見て確認してください。


■特徴1.
いちいちカテゴリ指定しなくても使える。以下のコードって必要なクラスで使いまわすからコピペすることが多いため、引数のところをついつい変更忘れがちになるよね。

private static final Logger log = Logger.getLogger( MyClass.class );

log5jならこんな感じ。

private static final Logger log = new Logger();

これで自動的にそのクラスがカテゴリとして追加される。ミスが減りそうでしょ。


■特徴2.
sprintf形式をサポートした。
以前はこんなコードを書いてたでしょ。

log.error( "This thing broke: " + foo + " due to bar: " + bar + " on this thing: " + car );

log5jならこんな感じで書ける。

log.error( "This thing broke: %s due to bar: %s on this thing: %s", foo, bar, car );

見やすくなったでしょ。

それにパフォーマンスの観点でも利点がある。
例えば以下のようなログ出力があった場合、

log.debug( "This thing broke: " + foo + " due to bar: " + bar + " on this thing: " + car );

debugレベルって運用時は通常offにしているけど、上記コードは出力されないくせに文字列連結が行われてしまう。CPU使用率やヒープ使用率が上がって、GCを増発させてしまう。かといって、

if(log.isDebugEnabled()) {
  log.debug( "This thing broke: " + foo + " due to bar: " + bar + " on this thing: " + car );
}

こんな風にするとコードが汚くなってしょうがないので、ここぞ!という時以外は使いたくないよね。

ってことで、sprintf形式のログ出力っていいでしょ。