2017-03-12 2 views
0

Migration von Groovy nach Scala hier. Bisher habe ich wie Scala wirklich, aber ich sofort fehle meine @Slf4j Anmerkung, wo ich konnte einfach haben:Scala-Entsprechung für Groovy @ Slf4j Annotation

@Slf4j 
class Fizz { 
    void doSomething() { 
     log.info("We're doing something now...") 
    } 
} 

... und Groovy würde eine SLF4J Logger erstellen und injizieren sie in Fizz ‚s-Bytecode für mich. Es erspart mir aus mit der folgenden in jede einzelne Klasse zu tun:

class Fizz { 
    Logger log = LoggerFactory.getLogger(Fizz) 

    void doSomething() { 
     log.info("We're doing something now...") 
    } 
} 

ich wirklich verpassen Sie diese so weit.

Ich frage mich, ob ich Züge/Mixins verwenden können, das Gleiche zu tun, aber es wäre generisch sein, so konnte ich es mit jede Klasse verwenden:

trait MyLogger[T] { 
    def log = Logger.getLogger(T) 
} 

Dann:

class Fizz extends MyLogger[Fizz] { 
    def doSomething() : Unit = { 
    log.info("Doing something now...") 
    } 
} 

usw. Ist das möglich? Wenn ja, bin ich hier nahe oder weit weg von der Basis?

+0

Es könnte von [Makro Annotation] (http://docs.scala-lang.org/overviews/macros/annotations.html) implementiert werden – jilen

+0

Alternative 'lazy val log = LoggerFactory.getLogger (getClass.getName)' würde erspart Ihnen die Notwendigkeit, einen Typparameter zu übergeben. –

Antwort

3

Eigentlich sind Sie auf dem richtigen Weg mit dem Zug:

trait Logging { 
    lazy val log = Logger.getLogger(getClass.getName) 
} 

Sie verwenden es wie folgt aus:

class MyStuff extends MySuperClass with Logging { 
    log.info("Setting up my stuff") 
} 

In der Tat, das ist ziemlich viel, was scala-logging tut - plus ein ein paar mehr Makros, um Sie zu retten, indem Sie die if (log.is_LEVEL_Enabled) log._LEVEL_ eingeben (aber immer noch in die endgültige Ausgabe).

+0

Danke @Sean Vieira (+1) - nur neugierig, warum der Logger "faul" sein muss? – smeeb

+1

Es ist nicht @smeeb - es vermeidet nur eine einzige zu erstellen, wenn Sie "Logging" in eine Klasse mischen, die nie protokolliert. –