Groovy@Slf4j注释的Scala等价物

Groovy@Slf4j注释的Scala等价物,scala,groovy,slf4j,traits,Scala,Groovy,Slf4j,Traits,从Groovy迁移到Scala。到目前为止,我真的很喜欢Scala,但是我马上就错过了@Slf4j注释,我可以在这里: @Slf4j class Fizz { void doSomething() { log.info("We're doing something now...") } } …Groovy会为我创建一个SLF4J记录器并将其注入Fizz的字节码中。这让我不用在每节课上都做以下事情: 到目前为止,我真的很想念这个 我想知道我是否可以使用traits/m

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

@Slf4j
class Fizz {
    void doSomething() {
      log.info("We're doing something now...")
    }
}
…Groovy会为我创建一个SLF4J记录器并将其注入Fizz的字节码中。这让我不用在每节课上都做以下事情:

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

我想知道我是否可以使用traits/mixin来做同样的事情,但是它必须是泛型的,这样我就可以在任何类中使用它:

然后:


等等,这有可能吗?如果是这样的话,我在这里是接近还是偏离了底线?

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

trait Logging {
  lazy val log = Logger.getLogger(getClass.getName)
}
您可以这样使用它:

class MyStuff extends MySuperClass with Logging {
  log.info("Setting up my stuff")
}

事实上,这几乎就是它的作用-再加上一些宏来保存您键入的if log.is_LEVEL_Enabled log._LEVEL_u,但仍将其放入最终输出中。

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

trait Logging {
  lazy val log = Logger.getLogger(getClass.getName)
}
您可以这样使用它:

class MyStuff extends MySuperClass with Logging {
  log.info("Setting up my stuff")
}

其实,,这几乎就是它的作用-再加上几个宏,以节省您键入if log.is_LEVEL_Enabled log._LEVEL_,但仍将其放入最终输出中。

它可以通过lazy val log=LoggerFactory实现。getLoggergetClass.getName将使您无需传递类型参数。它可以通过另一种方式实现lazy val log=LoggerFactory.getLoggergetClass.getName将使您无需传递类型参数。感谢@Sean Vieira+1-只是好奇为什么日志记录器必须是懒惰的?它不是@smeeb-如果您将日志记录混合到一个从不记录日志的类中,它只会避免创建一个。感谢@Sean Vieira+1-只是好奇为什么日志记录器必须是懒惰的?这是真的不是@smeeb——如果您将日志记录混入一个从不记录日志的类中,它只会避免创建一个。
class MyStuff extends MySuperClass with Logging {
  log.info("Setting up my stuff")
}