スケーラの共通のロギングパターンは、具体的なクラス(Liftweb、akkaなどのオープンソースプロジェクトを参照)と混合されたロギング特性を使用することです。そのようなスケーラでロギングの特性を定義するときの問題
何か:
trait Logging {
val loggerName = this.getClass.getName
@transient lazy val log = new Logger(loggerName)
}
これは、私が知る権利を使用しています正確に何ですが、私はこのため、パターンの問題とこだわっています。実際に、ロギング特性が派生したクラスによって混合されている場合、ロガーは最も派生したクラスの名前で使用されます。ここで
は自分自身を明確にする例です。
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
を誰もが解決策を見つけましたこの問題 ?
しかし、あなたが言っていることは、異なるロガーが欲しいということです: クラスA {val aLog = Logger(classOf [A])} クラスBはA {val bLog = Logger( cl assoo [B])} –