scala StrictLogging 和 Lazylogging 有什么区别?

What is the difference between scala StrictLogging and Lazylogging?

考虑以下使用 scala logging:

的代码
class MyClass extends LazyLogging {
  logger.debug("This is very convenient")
}

如果我改用 StrictLogging 有什么区别?我应该什么时候使用哪个?

编辑:我知道什么是懒惰。但是我无法从日志记录的角度获得它,以及与严格的日志记录相比,它与它的功能有何不同。这样我就可以了解何时使用哪个。

我假设你指的是 typesafes scala-logging library。区别仅在于logger由底层记录器定义的方式,它可以定义为普通值,也可以定义为惰性值,意思是:

trait LazyLogging {
  @volatile protected lazy val logger: Logger =
      Logger(LoggerFactory.getLogger(getClass.getName))
}

trait StrictLogging {
  protected val logger: Logger =
    Logger(LoggerFactory.getLogger(getClass.getName))
}

What is the difference between scala StrictLogging and Lazylogging?

让我们首先阅读两个特征定义;

trait LazyLogging {
 @volatile protected lazy val logger: Logger =
 Logger(LoggerFactory.getLogger(getClass.getName))
}

trait StrictLogging {
protected val logger: Logger =
 Logger(LoggerFactory.getLogger(getClass.getName))
}

主要区别在于 @volatilelazy 关键字。

lazy 是如何运作的?

lazy val 的主要特征是绑定表达式不会立即求值,而是在第一次访问时求值一次。当初始访问发生时,将计算表达式。在随后的访问中,不会进行进一步的评估,而是立即返回存储的结果。

对于多线程场景,@volatile 将强制内存在多个线程中进入一致状态。

实际上,这取决于个人用例使用哪个特征 LazyLoggingStrictLogging

好吧,每个人似乎都涵盖了 lazy 的含义,但并没有真正提到这会如何影响您的选择,所以我将尝试列出我自己遵循的准则。

  • 几乎默认使用 StrictLogging,特别是如果 class 是单例或者您知道日志方法将始终被调用。

  • 如果您重复创建大量具有此特征的对象,请使用 LazyLogging。但是,如果您这样做,您可能会考虑将此记录器放在 class 的伴随对象中,这样您就不会不断实例化 Logger 并一遍又一遍地调用 LoggerFactory.getLogger(...)

谁能想到 use/not 使用 LazyLogging 而不是 StrictLogging 的其他原因?