web-dev-qa-db-ja.com

scala StrictLoggingとLazyloggingの違いは何ですか?

scala logging を使用する以下のコードを検討してください:

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

代わりにStrictLoggingを使用した場合の違いは何ですか?どちらを使用すればよいですか?

編集:私は怠惰が何であるか知っています。しかし、ロギングの観点からそれを取得することはできません。厳密なロギングと比較した場合、その機能とどのように異なるのでしょうか。これは、どれを使用するかを理解できるようにするためです。

16
codingsplash

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))
}
13
Yuval Itzchakov

まあ、誰もがlazyの意味をカバーしているようですが、これがあなたの選択にどのように影響するかについては触れていなかったので、私が従うガイドラインをリストしてみます。

  • 特にクラスがシングルトンである場合、またはログメソッドが常に呼び出されることがわかっている場合は特に、デフォルトでStrictLoggingをかなり使用します。

  • この特性を持つオブジェクトを繰り返し作成する場合は、LazyLoggingを使用します。ただし、そうする場合は、このロガーをクラスのコンパニオンオブジェクトに配置して、Loggerのインスタンス化とLoggerFactory.getLogger(...)の呼び出しを繰り返し行わないようにすることを検討してください。

誰かがLazyLoggingよりもStrictLoggingを使用する/使用しない他の理由を考えられますか?

18
Cole Stanfield

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を使用する特性は、個々のユースケースによって異なります。

7
fabfas