Scala等效于Groovy @ Slf4j注释

时间:2017-03-12 12:07:17

标签: scala groovy slf4j traits

在此处从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...")
  }
}

等。这可能吗?如果是这样,我会在这里关闭或离开吗?

1 个答案:

答案 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_(但仍然把它放在最终输出中)。