Es scheint, dass gemeinsame Logging-Muster in Scala ist eine Logging-Trait zu verwenden, die mit konkreten Klasse gemischt wird (vgl. Open-Source-Projekte wie Liftweb, Akka, ...).
So etwas in der Art:
trait Logging {
val loggerName = this.getClass.getName
@transient lazy val log = new Logger(loggerName)
}
Das ist genau das, was ich gerade verwende, aber ich stehe wegen dieses Musters vor einem Problem. In der Tat, wenn die Logging-Eigenschaft von einer Klasse gemischt wird, die abgeleitet ist, wird der Logger mit dem Namen der am meisten abgeleiteten Klasse verwendet werden.
Hier ist ein Beispiel, um mich zu verdeutlichen:
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
}
}
Wenn ich dieses Programm ausführe, erhalte ich:
[b.B] : log from A
[b.B] : log from B
Anstelle von:
[a.A] : log from A
[b.B] : log from B
Hat jemand eine Lösung für dieses Problem gefunden?