Кажется, что общий шаблон ведения логов в scala - это использование черты Logging, смешанной с конкретным классом (см. Проекты с открытым исходным кодом, такие как 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
Кто-нибудь нашел решение этой проблемы?