请考虑以下使用scala日志记录的代码:
class MyClass extends LazyLogging { logger.debug("This is very convenient") }
如果我使用StrictLogging有什么区别?我什么时候应该使用哪个?
编辑:我知道懒惰是什么.但是我无法从日志记录的角度来看它,与严格的日志记录相比,它与功能有何不同.这样我才能理解何时使用哪一个.
好吧,每个人似乎已经涵盖了什么lazy
方法,但没有真正提到这会如何影响你的选择,所以我会尝试列出我自己遵循的指导方针.
StrictLogging
默认情况下使用pretty,特别是如果类是单例,或者您知道将始终调用日志方法.
使用LazyLogging
,如果你有这种特质产生大量的对象重复.如果您正在这样做,您可能会考虑将此记录器放在类的伴随对象中,这样您就不会一直进行实例化Logger
和调用LoggerFactory.getLogger(...)
.
谁能想到使用/不使用其他的原因LazyLogging
了StrictLogging
?
我假设您正在引用typesafes scala-logging库.区别仅在于logger
底层记录器定义的方式,它可以定义为正常值,也可以定义为惰性值,这意味着:
trait LazyLogging { @volatile protected lazy val logger: Logger = Logger(LoggerFactory.getLogger(getClass.getName)) }
VS
trait StrictLogging { protected val logger: Logger = Logger(LoggerFactory.getLogger(getClass.getName)) }
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
?
a的主要特征lazy val
是绑定表达式不会立即计算,而是在第一次访问时计算.初始访问发生时,将计算表达式.在后续访问中,不会进行进一步评估,而是立即返回存储的结果.
对于多线程场景,@volatile
将强制内存跨多个线程进入一致状态.
实际上,它取决于使用LazyLogging
或使用特性的个人用例StrictLogging
.