我有以下代码:
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 ...
我可以使用特征名称作为记录器名称吗?
答案 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 ...