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))
}
主要区别在于 @volatile
和 lazy
关键字。
lazy
是如何运作的?
lazy val
的主要特征是绑定表达式不会立即求值,而是在第一次访问时求值一次。当初始访问发生时,将计算表达式。在随后的访问中,不会进行进一步的评估,而是立即返回存储的结果。
对于多线程场景,@volatile
将强制内存在多个线程中进入一致状态。
实际上,这取决于个人用例使用哪个特征 LazyLogging
或 StrictLogging
。
好吧,每个人似乎都涵盖了 lazy
的含义,但并没有真正提到这会如何影响您的选择,所以我将尝试列出我自己遵循的准则。
几乎默认使用 StrictLogging
,特别是如果 class 是单例或者您知道日志方法将始终被调用。
如果您重复创建大量具有此特征的对象,请使用 LazyLogging
。但是,如果您这样做,您可能会考虑将此记录器放在 class 的伴随对象中,这样您就不会不断实例化 Logger
并一遍又一遍地调用 LoggerFactory.getLogger(...)
。
谁能想到 use/not 使用 LazyLogging
而不是 StrictLogging
的其他原因?
考虑以下使用 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))
}
主要区别在于 @volatile
和 lazy
关键字。
lazy
是如何运作的?
lazy val
的主要特征是绑定表达式不会立即求值,而是在第一次访问时求值一次。当初始访问发生时,将计算表达式。在随后的访问中,不会进行进一步的评估,而是立即返回存储的结果。
对于多线程场景,@volatile
将强制内存在多个线程中进入一致状态。
实际上,这取决于个人用例使用哪个特征 LazyLogging
或 StrictLogging
。
好吧,每个人似乎都涵盖了 lazy
的含义,但并没有真正提到这会如何影响您的选择,所以我将尝试列出我自己遵循的准则。
几乎默认使用
StrictLogging
,特别是如果 class 是单例或者您知道日志方法将始终被调用。如果您重复创建大量具有此特征的对象,请使用
LazyLogging
。但是,如果您这样做,您可能会考虑将此记录器放在 class 的伴随对象中,这样您就不会不断实例化Logger
并一遍又一遍地调用LoggerFactory.getLogger(...)
。
谁能想到 use/not 使用 LazyLogging
而不是 StrictLogging
的其他原因?