[scala]log4jを使う

メモ。
Javaだとstaticなフィールドで使うのだけれど、scalaはclassとobjectに分かれているので、一瞬悩みます。
遅延評価も有効だろうとの判断からlazyにしています。


これであってるかな?

import org.apache.commons.logging.LogFactory
import org.apache.log4j.xml.DOMConfigurator

// エントリとなるオブジェクト
object Foo {
  DOMConfigurator.configure("./log4j.xml");
  private lazy val logger = LogFactory.getLog(Foo.getClass)

  // ...
  logger.trace("Foo")
  // ...
  def main(args:Array[String]) {
    // ...
  }
}
import org.apache.commons.logging.LogFactory

object Bar {
  private lazy val logger = LogFactory.getLog(Bar.getClass)
}

class Bar {
  import Bar.logger
  // ...
  logger.trace("Bar")
}

[scala]log4jを使う

探してみたら、以下のを見つけました。
よさげです。
http://stackoverflow.com/questions/2018528/logging-in-scala
traitになってて、とても使いやすそう。
それに、メッセージの引数が名前渡しになっているので、
出力しないメッセージにはCPUリソースを食わないようになっています。

名前渡し=遅延評価だと勘違いしてた。

http://d.hatena.ne.jp/kujira16/20111119/1321708622
http://d.hatena.ne.jp/kanno_kanno/20130202/1359777436
http://d.hatena.ne.jp/xuwei/20120818/1345271478

勘違いしてました。
なので、引数は一度しか評価されないと。
念のため、自分でも確認。

scala> def log(msg: => String) { println(msg); println(msg) }
log: (msg: => String)Unit

scala> log({println("eval"); "Message"})
eval
Message
eval
Message

scala> 

うわっ、本当だ!
だから、「遅延評価」とは呼ばずに、「名前渡し」と呼ぶのか?