3

Scalaでの一般的なロギングパターンは、具象クラスと混合されたロギング特性を使用することであるようです(Liftweb、akkaなどのオープンソースプロジェクトを参照)。

そんな感じ:

trait Logging {
  val loggerName = this.getClass.getName
  @transient lazy val log = new Logger(loggerName)
}

これはまさに私が使用しているものですが、このパターンのために問題が発生します。実際、Logging特性が派生したクラスと混合されている場合、Loggerは最も派生したクラスの名前で使用されます。

これが自分自身を明確にするための例です:

class Logger(logName : String){
  def debug( msg : String ) { println("["+logName+"] : "+msg) }
}

trait Logging {
  val loggerName = this.getClass.getName
  @transient lazy val log = new Logger(loggerName)
}

package a {
  class A extends Logging {
    log.debug("log from A")
  }
}

package b {
  import a._
  class B extends A with Logging {
    log.debug("log from B")
  }
}

object LogTest {
  import b._
  def main(args : Array[String]) = {
    val instance = new B
  }
}

このプログラムを実行すると、次のようになります。

[b.B] : log from A
[b.B] : log from B

それ以外の:

[a.A] : log from A
[b.B] : log from B

誰かがこの問題の解決策を見つけましたか?

4

3 に答える 3

2

コンパニオン オブジェクトでロガーを使用して、この効果を実現できます。

object A extends Logging; 
class A { import A._
  log.debug("log from A")
}

object B extends Logging; 
class B extends A  { import B._
  log.debug("log from B")
}
于 2010-11-26T15:03:02.153 に答える
2

これは間違いなくあなたが望む動作ではないというのが私の経験です。

メソッドのオーバーライドを含むクラス階層がある場合、ログは次のような行でいっぱいになることがあります。

13:44:42.654 - AbstractFooService [INFO] : I have a: foo
13:44:42.656 - AbstractFooService [INFO] : I have bar-d my: foo

そして、どのような具体的なサービスの実装を扱っていたのか自問することになります。わからない場合は、現在の場所に到達するためにどのコード パスが使用されたかをどのように確認できますか? たぶん、2 つの間に寄り添う 3 番目のステートメントがあったはずです。

13:44:42.655 - SpecialFooService [INFO] : I want to baz this foo to bar

ログに含まれている場合、デバッグがはるかに簡単

13:44:42.654 - DefaultFooService [INFO] : I have a: foo
13:44:42.656 - DefaultFooService [INFO] : I have bar-d my: foo

そうすれば、間違った foo サービスを使用しているとすぐにわかるからです。

于 2010-11-27T12:44:28.423 に答える
-1

これは明らかかもしれませんが、トレイトを継承したくない場合は、Loggingトレイトを混在させる代わりに、単純にプライベート変数を使用できます。

class A {
  private val log = Logger(this)
}

class B extends A with Logging {
}

また

class A extends Logging {
}

class B extends A {
  override lazy val log = // ...
}
于 2010-11-26T15:47:18.030 に答える