在此处从Groovy迁移到Scala。到目前为止,我真的很喜欢Scala,但是我立即错过了@Slf4j
注释,我可以在那里注意:
@Slf4j
class Fizz {
void doSomething() {
log.info("We're doing something now...")
}
}
...而Groovy会创建一个SLF4J记录器并将其注入Fizz
的字节码中。它使我不必在每个类中执行以下操作:
class Fizz {
Logger log = LoggerFactory.getLogger(Fizz)
void doSomething() {
log.info("We're doing something now...")
}
}
到目前为止,我真的错过了这个。
我想知道我是否可以使用traits / mixins来做同样的事情,但它必须是通用的,所以我可以将它与任何类一起使用:
trait MyLogger[T] {
def log = Logger.getLogger(T)
}
然后:
class Fizz extends MyLogger[Fizz] {
def doSomething() : Unit = {
log.info("Doing something now...")
}
}
等。这可能吗?如果是这样,我会在这里关闭或离开吗?
答案 0 :(得分:3)
实际上,你的特质是正确的:
trait Logging {
lazy val log = Logger.getLogger(getClass.getName)
}
你这样使用它:
class MyStuff extends MySuperClass with Logging {
log.info("Setting up my stuff")
}
事实上,这几乎是scala-logging的作用 - 再加上一些宏来节省你输入if (log.is_LEVEL_Enabled) log._LEVEL_
(但仍然把它放在最终输出中)。