scala StrictLogging和Lazylogging之间有什么区别?

scala StrictLogging和Lazylogging之间有什么区别?,scala,logging,typesafe,Scala,Logging,Typesafe,考虑使用以下代码: 如果改用StrictLogging,有什么区别?我什么时候应该用哪个 编辑:我知道什么是懒惰。但我无法从日志的角度来理解它,它与严格的日志相比有什么不同。这样我就可以知道什么时候该用哪一个了。我想你指的是。区别仅在于底层记录器定义logger的方式,它可以定义为正常值,也可以定义为延迟值,这意味着: trait LazyLogging { @volatile protected lazy val logger: Logger = Logger(LoggerFa

考虑使用以下代码:

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


编辑:我知道什么是懒惰。但我无法从日志的角度来理解它,它与严格的日志相比有什么不同。这样我就可以知道什么时候该用哪一个了。

我想你指的是。区别仅在于底层记录器定义
logger
的方式,它可以定义为正常值,也可以定义为延迟值,这意味着:

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

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))
}
主要区别在于
@volatile
lazy
关键字

懒惰是如何工作的?

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

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


实际上,这取决于具体的用例,即使用
LazyLogging
StrictLogging

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

  • 默认情况下基本上使用
    StrictLogging
    ,尤其是当类是单例的时候,或者您知道log方法总是会被调用的时候

  • 如果要重复创建大量具有此特性的对象,请使用
    LazyLogging
    。如果您正在这样做,您可能会考虑将这个记录器放在类的一个伴生对象中,这样您就不会不断实例化
    logger
    并反复调用
    LoggerFactory.getLogger(…)


任何人都能想到使用/不使用
LazyLogging
而不是
StrictLogging
的其他原因吗?

您应该提供更多信息。那是什么课?谢谢你的回答。懒惰日志是非阻塞的吗?如果是这样的话,如何实现呢?
com.typesafe.scalaLogg
包中的Logger类包装了一个底层的
SLF4J
Logger
SLF4J
作为各种日志框架(例如
java.util.logging
logback
log4j
等)的简单外观或抽象。您需要了解日志框架的实现。希望,这有帮助!使用
LazyLogging
trait进行日志记录是否明显?所有的日志记录?这对我来说并不明显。是的,当你不知道用例时,它就不明显了-更正!关于lazy的有用信息,但我认为仍然没有解决这一点。从日志上下文来看,日志记录器被声明为lazy Val有什么好处?它是否像Akka日志记录一样成为非阻塞日志记录?
LazyLogging
适用于您想要延迟
Logger
创建的情况。这样做的原因取决于您的用例,但在大多数情况下,
StrictLogging
可能是您想要的。问问自己:“如果我最终还是要定期记录日志,为什么不提前创建它呢?”当使用Spark之类的框架时,为实现计算而编写的代码块必须是可序列化的。如果您有一个要在集群中广播的类,并且希望在该类中使用日志记录,那么最好的方法就是使用LazyLogging。这张jira票(对我来说)表明LazzyLogging记录器是可序列化的(但我自己还没有验证):我相信这个答案应该被接受
trait StrictLogging {
  protected val logger: Logger =
    Logger(LoggerFactory.getLogger(getClass.getName))
}
trait LazyLogging {
 @volatile protected lazy val logger: Logger =
 Logger(LoggerFactory.getLogger(getClass.getName))
}

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