2016-03-10 2 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 ... 

Или, может быть, имена источников Scala:

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

Могу ли я использовать имя признака в качестве имени регистратора?

ответ

3

Main$$anon$1 является «совместимым с java» именем вашего анонимного скомпилированного класса scala new DoAll {}. Это то же самое для всех свойств, потому что getClass.getName возвращает то же значение.

Если вы хотите иметь разные значения, вы должны переопределить logger по каждому признаку, и вместо имени класса использовать некоторые предопределенные значения при его создании.

Например, вы можете использовать следующий код:

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

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

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

и т.д ...

+0

Это хороший ответ. Но как я могу это сделать без явного имени logger? – 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 ... 
Смежные вопросы