[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>
うわっ、本当だ!
だから、「遅延評価」とは呼ばずに、「名前渡し」と呼ぶのか?