Groovy @Slf4j 注释的 Scala 等价物

Scala equivalent for Groovy @Slf4j annotation

在此处从 Groovy 迁移到 Scala。到目前为止,我真的很喜欢 Scala,但是我马上就错过了我的 @Slf4j 注释,我可以在那里使用:

@Slf4j
class Fizz {
    void doSomething() {
      log.info("We're doing something now...")
    }
}

...和 ​​Groovy 会为我创建一个 SLF4J 记录器并将其注入 Fizz 的字节码。它使我不必在 每个 class:

中执行以下操作
class Fizz {
    Logger log = LoggerFactory.getLogger(Fizz)

    void doSomething() {
      log.info("We're doing something now...")
    }
}

到目前为止我真的想念这个。

我想知道我是否可以使用 traits/mixins 来做同样的事情,但它必须是通用的,所以我可以将它与 any [=36] 一起使用=]:

trait MyLogger[T] {
    def log = Logger.getLogger(T)
}

然后:

class Fizz extends MyLogger[Fizz] {
  def doSomething() : Unit = {
    log.info("Doing something now...")
  }
}

等这可能吗?如果是这样,我是在接近基地还是远离基地?

事实上,你的特质是正确的:

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_(但仍将其放在最终输出中)。