使用特征名称作为记录器名称

时间:2016-03-10 10:54:37

标签: scala logging slf4j

我有以下代码:

import org.slf4j.LoggerFactory
trait Logger {
    lazy val log = LoggerFactory.getLogger(getClass.getName)
}

trait DoSomething1 extends Logger { ... }
trait DoSomething2 extends Logger { ... }
trait DoSomething3 extends Logger { ... }
...
trait DoAll extends DoSomething1 with DoSomething2 with ...

val act = new DoAll {}

在我的日志中,我看到:

INFO  Main$$anon$1: blablabla ...
INFO  Main$$anon$1: blablabla ...
INFO  Main$$anon$1: blablabla ...
ERROR Main$$anon$1: blablabla ...
DEBUG Main$$anon$1: blablabla ...

我无法识别哪条特征打印每条消息。 我希望看到类似的东西:

INFO  Main$$DoSomething1$1: blablabla ...
INFO  Main$$DoSomething3$1: blablabla ...
DEBUG Main$$DoSomething2$1: blablabla ...

或者Scala源名称:

INFO  Main$$DoSomething1.scala$1: blablabla ...
INFO  Main$$DoSomething3.scala$1: blablabla ...
DEBUG Main$$DoSomething2.scala$1: blablabla ...

我可以使用特征名称作为记录器名称吗?

2 个答案:

答案 0 :(得分:3)

Main$$anon$1是匿名编译的scala类new DoAll {}的“java兼容”名称。 对于所有特征都是一样的,因为getClass.getName返回相同的值。

如果您想拥有不同的值,则应在每个特征中覆盖logger, 而不是类名在构造它时使用一些预定义值。

例如,您可以使用以下代码:

trait Logger {
    val logger = LoggerFactory.getLogger(loggerName)
    def loggerName = getClass.getName
}

trait A {
    def loggerName = "A"
    // ...
}

trait B {
    def loggerName = "B"
    // ...
}
等等......

答案 1 :(得分:0)

您可以使用的简单模式是将Logger混合到随播对象中并导入它:

object DoSomething1 extends Logger
trait DoSomething1 {
   import DoSomething1._
   ...
}
object DoSomething2 extends Logger
trait DoSomething2 {
   import DoSomething2._
   ...
}
object DoSomething3 extends Logger
trait DoSomething3 {
   import DoSomething3._
   ...
}
trait DoAll extends DoSomething1 with DoSomething2 with ...

val act = new DoAll {}

然后你应该有以下几点:

INFO  DoSomething1$: blablabla ...
INFO  DoSomething3$: blablabla ...
DEBUG  DoSomething2$: blablabla ...