考虑下面使用了scala logging的代码:
class MyClass extends LazyLogging {
logger.debug("This is very convenient")
}
如果我使用StrictLogging,有什么区别?我应该在什么情况下使用哪种日志记录方式?
编辑:我知道lazy是什么。但我无法从日志记录的角度理解它,以及与严格日志记录相比如何实现其功能。这样我就可以了解何时使用哪种方式。
考虑下面使用了scala logging的代码:
class MyClass extends LazyLogging {
logger.debug("This is very convenient")
}
如果我使用StrictLogging,有什么区别?我应该在什么情况下使用哪种日志记录方式?
编辑:我知道lazy是什么。但我无法从日志记录的角度理解它,以及与严格日志记录相比如何实现其功能。这样我就可以了解何时使用哪种方式。
好,大家似乎已经讲述了lazy
的意思,但是并没有真正提到这如何影响你的选择,所以我将尝试列出我自己遵循的准则。
默认情况下使用StrictLogging
,特别是如果该类是单例或您知道日志方法将始终被调用。
如果您正在重复创建具有此特性的许多对象,请使用LazyLogging
。不过,如果您这样做,可能需要考虑将此记录器放在类的伴随对象中,以便不要一遍又一遍地实例化Logger
并调用LoggerFactory.getLogger(...)
。
还有其他使用/不使用LazyLogging
而非StrictLogging
的原因吗?
我假设你正在谈论 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))
}
LazyLogging
可用于延迟 Logger
的创建。这样做的原因取决于您的使用情况,但在大多数情况下,StrictLogging
可能是您想要的。请问自己:“如果我最终仍然会经常记录日志,为什么不事先创建它呢?” - Cole Stanfieldtrait 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
的工作原理是:延迟初始化。也就是说,绑定表达式不会立即计算,而是在第一次访问时才计算。当第一次访问发生时,表达式被计算。在后续访问中,不会进行进一步的计算,而是立即返回存储的结果。@volatile
将强制内存跨多个线程保持一致状态。LazyLogging
还是StrictLogging
取决于个别使用情况。com.typesafe.scalalogging
包中的 Logger 类封装了底层的 SLF4J
日志记录器。SLF4J
作为各种日志框架(例如 java.util.logging
、logback
、log4j
)的简单外观或抽象服务。您需要查看日志框架的实现。希望这有所帮助! - fabfasLazyLogging
特质来记录日志是否明显?所有的日志都是吗?对我来说不是很明显。 - Cole Stanfield