2016-03-10 63 views
0

我有以下代碼:性狀名稱作爲記錄器名稱

import org.slf4j.LoggerFactory 
trait Logger { 
    lazy val log = LoggerFactory.getLogger(getClass.getName) 
} 

trait DoSomething1 extends Logger { ... } 
trait DoSomething2 extends Logger { ... } 
trait DoSomething3 extends Logger { ... } 
... 
trait DoAll extends DoSomething1 with DoSomething2 with ... 

val act = new DoAll {} 

在我的日誌我看到:

INFO Main$$anon$1: blablabla ... 
INFO Main$$anon$1: blablabla ... 
INFO Main$$anon$1: blablabla ... 
ERROR Main$$anon$1: blablabla ... 
DEBUG Main$$anon$1: blablabla ... 

我無法實現其特質打印每條消息。 我想看到的東西,如:

INFO Main$$DoSomething1$1: blablabla ... 
INFO Main$$DoSomething3$1: blablabla ... 
DEBUG Main$$DoSomething2$1: blablabla ... 

或許斯卡拉源名稱:

INFO Main$$DoSomething1.scala$1: blablabla ... 
INFO Main$$DoSomething3.scala$1: blablabla ... 
DEBUG Main$$DoSomething2.scala$1: blablabla ... 

我可以用一個特徵名稱作爲記錄器的名字嗎?

回答

3

Main$$anon$1是匿名編譯的scala類new DoAll {}的「java兼容」名稱。 所有性狀都是一樣的,因爲getClass.getName返回相同的值。

如果你想有不同的值,你應該在每個trait中覆蓋logger, 而不是類名,而在構造它時使用一些預定義的值。

例如,你可以使用下面的代碼:

trait Logger { 
    val logger = LoggerFactory.getLogger(loggerName) 
    def loggerName = getClass.getName 
} 

trait A { 
    def loggerName = "A" 
    // ... 
} 

trait B { 
    def loggerName = "B" 
    // ... 
} 

等等

+0

這是一個很好的答案。但是我怎麼能沒有顯式的loggerName呢? – sheh

0

一個簡單的模式,你可以用就是Logger組合成一個同伴對象,並導入:

object DoSomething1 extends Logger 
trait DoSomething1 { 
    import DoSomething1._ 
    ... 
} 
object DoSomething2 extends Logger 
trait DoSomething2 { 
    import DoSomething2._ 
    ... 
} 
object DoSomething3 extends Logger 
trait DoSomething3 { 
    import DoSomething3._ 
    ... 
} 
trait DoAll extends DoSomething1 with DoSomething2 with ... 

val act = new DoAll {} 

然後你應該有一些東西:

INFO DoSomething1$: blablabla ... 
INFO DoSomething3$: blablabla ... 
DEBUG DoSomething2$: blablabla ...