Scalaでの一般的なロギングパターンは、具象クラスと混合されたロギング特性を使用することであるようです(Liftweb、akkaなどのオープンソースプロジェクトを参照)。
そんな感じ:
trait Logging {
val loggerName = this.getClass.getName
@transient lazy val log = new Logger(loggerName)
}
これはまさに私が使用しているものですが、このパターンのために問題が発生します。実際、Logging特性が派生したクラスと混合されている場合、Loggerは最も派生したクラスの名前で使用されます。
これが自分自身を明確にするための例です:
class Logger(logName : String){
def debug( msg : String ) { println("["+logName+"] : "+msg) }
}
trait Logging {
val loggerName = this.getClass.getName
@transient lazy val log = new Logger(loggerName)
}
package a {
class A extends Logging {
log.debug("log from A")
}
}
package b {
import a._
class B extends A with Logging {
log.debug("log from B")
}
}
object LogTest {
import b._
def main(args : Array[String]) = {
val instance = new B
}
}
このプログラムを実行すると、次のようになります。
[b.B] : log from A
[b.B] : log from B
それ以外の:
[a.A] : log from A
[b.B] : log from B
誰かがこの問題の解決策を見つけましたか?