【问题标题】:Scala equivalent for Groovy @Slf4j annotationGroovy @Slf4j 注释的 Scala 等效项
【发布时间】:2017-08-02 11:56:25
【问题描述】:

在这里从 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 来做同样的事情,但它必须是通用的,所以我可以将它与 any 类一起使用:

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

然后:

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

等等。这可能吗?如果是这样,我是关闭还是远离基地?

【问题讨论】:

  • 可以由macro annotation实现
  • 或者lazy val log = LoggerFactory.getLogger(getClass.getName) 会让您无需传递类型参数。

标签: scala groovy slf4j traits


【解决方案1】:

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

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

【讨论】:

  • 感谢@Sean Vieira (+1) - 只是好奇为什么记录器必须是 lazy
  • 它没有 @smeeb - 如果你将 Logging 混合到一个从不记录的类中,它只会避免创建一个。
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多