Scala StrictLogging和Lazylogging有什么区别?

26

考虑下面使用了scala logging的代码:

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

如果我使用StrictLogging,有什么区别?我应该在什么情况下使用哪种日志记录方式?

编辑:我知道lazy是什么。但我无法从日志记录的角度理解它,以及与严格日志记录相比如何实现其功能。这样我就可以了解何时使用哪种方式。


1
你应该包含更多的信息。那个LazyLogging类是什么? - pedrorijo91
3个回答

27

好,大家似乎已经讲述了lazy的意思,但是并没有真正提到这如何影响你的选择,所以我将尝试列出我自己遵循的准则。

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

  • 如果您正在重复创建具有此特性的许多对象,请使用LazyLogging。不过,如果您这样做,可能需要考虑将此记录器放在类的伴随对象中,以便不要一遍又一遍地实例化Logger并调用LoggerFactory.getLogger(...)

还有其他使用/不使用LazyLogging而非StrictLogging的原因吗?


10
在使用像Spark这样的框架时,编写用于执行计算的代码块必须是可序列化的。如果您有一个要在集群中广播并且想在该类中使用日志记录的类,则最好的方法可能是使用LazyLogging。这个Jira票据建议(对我来说)LazzyLogging记录器是可序列化的(但我还没有自己验证):https://github.com/lightbend/scala-logging/issues/26 - Chris Bedford
我相信这个答案应该被接受。 - Sergey Lihoman

12

我假设你正在谈论 typesafes scala-logging 库。两者的区别只在于底层日志记录器定义 logger 的方式,它可以被定义为普通值或惰性值,也就是说:

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

vs

的翻译是:vs。
trait StrictLogging {
  protected val logger: Logger =
    Logger(LoggerFactory.getLogger(getClass.getName))
}

从日志记录的角度来看,将logger声明为lazy val有什么优势?它是否像Akka日志记录一样变得非阻塞? - codingsplash
1
LazyLogging 可用于延迟 Logger 的创建。这样做的原因取决于您的使用情况,但在大多数情况下,StrictLogging 可能是您想要的。请问自己:“如果我最终仍然会经常记录日志,为什么不事先创建它呢?” - Cole Stanfield

10
什么是scala StrictLogging和Lazylogging之间的区别? 让我们首先阅读两个trait的定义;
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的工作原理是:延迟初始化。也就是说,绑定表达式不会立即计算,而是在第一次访问时才计算。当第一次访问发生时,表达式被计算。在后续访问中,不会进行进一步的计算,而是立即返回存储的结果。
对于多线程场景,@volatile将强制内存跨多个线程保持一致状态。
实际上,使用LazyLogging还是StrictLogging取决于个别使用情况。

谢谢你的好回答。懒惰日志记录是非阻塞的吗?如果是,它是如何实现的? - codingsplash
1
com.typesafe.scalalogging 包中的 Logger 类封装了底层的 SLF4J 日志记录器。SLF4J 作为各种日志框架(例如 java.util.logginglogbacklog4j)的简单外观或抽象服务。您需要查看日志框架的实现。希望这有所帮助! - fabfas
使用LazyLogging特质来记录日志是否明显?所有的日志都是吗?对我来说不是很明显。 - Cole Stanfield
是的,如果您不知道用例,它并不明显 - 已更正! - fabfas
关于“lazy”的信息很有帮助,但我认为还没有解决重点问题。 - Cole Stanfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接