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))
}
まあ、誰もがlazy
の意味をカバーしているようですが、これがあなたの選択にどのように影響するかについては触れていなかったので、私が従うガイドラインをリストしてみます。
特にクラスがシングルトンである場合、またはログメソッドが常に呼び出されることがわかっている場合は特に、デフォルトでStrictLogging
をかなり使用します。
この特性を持つオブジェクトを繰り返し作成する場合は、LazyLogging
を使用します。ただし、そうする場合は、このロガーをクラスのコンパニオンオブジェクトに配置して、Logger
のインスタンス化とLoggerFactory.getLogger(...)
の呼び出しを繰り返し行わないようにすることを検討してください。
誰かがLazyLogging
よりもStrictLogging
を使用する/使用しない他の理由を考えられますか?
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
はどのように機能しますか?
lazy val
の主な特徴は、バインドされた式がすぐに評価されるのではなく、最初のアクセス時に一度評価されることです。最初のアクセスが発生すると、式が評価されます。その後のアクセスでは、それ以上の評価は行われず、代わりに格納された結果がすぐに返されます。
マルチスレッドシナリオの場合、@volatile
はメモリを複数のスレッド間で一貫した状態にします。
実際、LazyLogging
またはStrictLogging
を使用する特性は、個々のユースケースによって異なります。