scala StrictLogging和Lazylogging有什么区别?

时间:2017-01-14 10:34:04

标签: scala logging typesafe

请考虑以下使用scala logging的代码:

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

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

编辑:我知道懒惰是什么。但是我无法从日志记录的角度来看它,与严格的日志记录相比,它与功能有何不同。这样我才能理解何时使用哪一个。

3 个答案:

答案 0 :(得分:15)

好吧,每个人似乎已经涵盖了lazy的含义,但没有真正提到这会影响您的选择,所以我会尝试列出我自己遵循的指南。

  • 默认情况下使用StrictLogging,特别是如果该类是单例,或者您知道将始终调用日志方法。

  • 如果您重复创建具有此特征的大量对象,请使用LazyLogging。但是,如果您正在执行此操作,则可以考虑将此记录器放在课程的伴随对象中,这样您就不会一直实例化Logger并反复调用LoggerFactory.getLogger(...)。 / p>

有人可以考虑使用/不使用LazyLogging而不是StrictLogging的其他原因吗?

答案 1 :(得分:12)

我假设您正在引用typesafes scala-logging library。差异仅在于override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch in touches { print("touched!") } guard let parent = self.parent else { return } parent.touchesBegan(touches, with: event) } 由基础记录器定义的方式,它可以定义为正常值,也可以定义为惰性值,这意味着:

logger

VS

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

答案 2 :(得分:7)

  

scala StrictLogging和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的特性的个别用例。