Slf4J でロギング

 Scala をやろうなんて尖った方は Java では Commons Logging + Log4J なんてとっくに卒業して Slf4J + LOGBack なんて構成を使っていたかと思います。

 今回は、実はそれとはあんまり関係ない話で、Commons Logging でも使える話です。

 Java でこんなコードがあったとします。

package example

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Hoge {
    private static final Logger LOGGER = LoggerFactory.getLogger(Hoge.class)

    public void fuga() {
        LOGGER.debug("debug")
    }
}

 Scala ビギナーの私は、これを Scala に移植するにはどうしたらいいか悩んだわけです。


 「The Uncarved Blog: Log4j for Scala」という記事を見つけたのでこれがいいかもと漠然と思ったのですが、これはダメですね。なぜなら

  • Hogeインスタンスを作るたびにロガーの取得が動いて非効率的。
  • this.getClass でクラス型を取得しているのでクラスを継承するとロガー名が変わる。
    • Seasar なんかで DI するやつに使ったりしたら大変なことに!

 ということで私が考えついたのがこのやり方。import の出現位置なんか、生粋の Java プログラマが見たら卒倒しそうな位キモいです。でも、メンバメソッドのようにロギング用メソッドが使えるのがいい! logger を private にしているのは他の関係のないクラスから呼ばれないようにするためです。

package example

import org.slf4j.LoggerFactory

object Hoge {
  private val logger = LoggerFactory.getLogger(classOf[Hoge])
}

class Hoge {
  import Hoge.logger._

  def fuga = debug("debug")
}

 もっと良い書き方があったらぜひ教えてください!