似乎 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
有没有人找到解决这个问题的方法?