【问题标题】:What is the difference between scala StrictLogging and Lazylogging?scala StrictLogging 和 Lazylogging 有什么区别?
【发布时间】:2017-05-29 16:10:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您应该包含更多信息。 LazyLogging 类是什么?

标签: scala logging typesafe


【解决方案1】:

好吧,似乎每个人都了解了lazy 的含义,但并没有真正提及这对您的选择有何影响,因此我将尝试列出我自己遵循的准则。

  • 默认使用StrictLogging,尤其是当类是单例或者你知道日志方法总是会被调用时。

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

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

【讨论】:

  • 当使用像 Spark 这样的框架时,您为实现计算而编写的代码块必须是可序列化的。如果您有一个要在集群中广播的类,并且您想在该类中使用日志记录,那么最好的方法可能是使用 LazyLogging。这张 jira 票(对我来说)表明 LazzyLogging 记录器是可序列化的(但我自己还没有验证):github.com/lightbend/scala-logging/issues/26
  • 我相信这个答案应该被接受一个
【解决方案2】:

我假设您指的是typesafes scala-logging library。区别只是logger是底层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))
}

【讨论】:

  • 从日志上下文中我们得到什么优势,即 logger 被声明为惰性 Val?会不会像 Akka 日志那样变成非阻塞的?
  • LazyLogging 可用于您想推迟Logger 创建。这样做的原因取决于您的用例,但在大多数情况下,StrictLogging 可能是您想要的。问问自己“如果我最终还是要定期记录,为什么不预先创建它”。
【解决方案3】:

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 的特征取决于个人用例。

【讨论】:

  • 感谢您的精彩回答。惰性日志记录是非阻塞的吗?如果有怎么办?
  • com.typesafe.scalalogging 包中的 Logger 类包装了底层的 SLF4J 记录器。 SLF4J 用作各种日志框架的简单外观或抽象(例如 java.util.logginglogbacklog4j 等)。您需要查看日志记录框架的实现。希望,这会有所帮助!
  • 使用LazyLogging trait 进行日志记录是否明显?所有日志记录?这对我来说并不明显。
  • 是的,当您不知道用例时,这并不明显 - 已更正!
  • lazy 上的有用信息,但仍然没有解决我认为的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2011-12-02
  • 2019-09-10
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多