ログの文字列結合ヒントきてたのか

http://d.hatena.ne.jp/lumber-mill/20100725#1280012532

6.8まではなかった気がする。

ログを出すときは文字列の連結等が入る場合実際にログのレベルがあってなくても、連結した結果をパラメータとして渡すので連結してるとパフォーマンス問題引き起こすかもしれないよ!という警告ですね。

つまり以下がだめなコード。

Logger.getLogger(Hoge.class.getName()).log(Level.SEVERE, "abc" + 123);


ヒント適用後

Logger.getLogger(Hoge.class.getName()).log(Level.SEVERE, "abc{0}", 123);

見てわかるとおり、パラメータはそのまま渡しつつ、ログレベルが一致したときだけ、内部で結合処理をするというわけです。

SLF4Jもフォーマットと配列のパラメータ引数があるのでこういう書き方は可能です。

たしかLOG4JやCommons Loggingはこの書き方は出来なかったと思います。if文によるガードが必要だったと記憶しています。なんでおいらは好きじゃないです。


可変長引数使うように書き直してくれるのが一番ですけどね。ロギング用ラッパ作るのは容易なのでたぶんみんな作っていると思いますけど。そうじゃなきゃLOG4JやCommons Loggingは使い物にならないわけで。今のLOG4JやCommons Loggingは大幅にパワーアップしていてそのまま使えるのかもしれませんけどね。