2013-06-06 5 views
8

varargs slf4j dotyczące rejestrowania połączeń są bardzo przydatne w mojej pracy JavaW jaki sposób mogę wykorzystać warianty SLF4J do logowania w strukturze Play2.1?

Logger log = LoggerFactory.getLogger(getClass()); 
log.debug("Hello, {}. The current time is {}", "robert", new Date()); 

Próbując zrobić to prosty przykład podczas odtwarzania 2.1 framework/Scala i biegnę do kompilatora odrzucając mnie.

import play.api._ 
import play.api.mvc._ 
import org.slf4j.LoggerFactory 

object Application extends Controller { 
    val log: org.slf4j.Logger = LoggerFactory.getLogger(getClass()) 

    def hb = Action { 
    val message = makeMessage() 
    // COMPILER HATES THIS: ambiguous reference compiler error here 
    log.info("Hello {}. The current time is {}", "robert", new java.util.Date()) 
    Ok(message) 
    } 
    def makeMessage(): String = { return "stuff" } 
} 

[dm2-server] $ compile 
[info] Compiling 2 Scala sources to /Users/bobk/work/dm2-server/target/scala-2.10/classes... 
[error] /Users/bobk/work/dm2-server/app/controllers/Application.scala:16: ambiguous reference to overloaded definition, 
[error] both method info in trait Logger of type (x$1: String, x$2: <repeated...>[Object])Unit 
[error] and method info in trait Logger of type (x$1: String, x$2: Any, x$3: Any)Unit 
[error] match argument types (String,String,java.util.Date) 
[error]  log.info("Hello {}. The current time is {}", "robert", new java.util.Date()) 
[error]  ^
[error] one error found 
[error] (compile:compile) Compilation failed 
[error] Total time: 1 s, completed Jun 6, 2013 10:54:41 AM 

Co to za błąd i jak mogę go pokonać, aby połączyć się z interfejsem API SLF4J? Jeśli nie mogę tego zrobić, w jaki sposób mogę użyć Logowania w Play 2.1, aby uzyskać varargs w moich logujących rozmowach? W Scala-land coś jest nie tak.

Odpowiedz

6

Jakiej wersji SLF4J używasz? Jeśli możesz wrócić do wersji 1.6.6 lub nowszej, możesz uniknąć tego problemu w niejednoznaczności. Te dwie sygnatury niestety wyglądają dokładnie tak samo, jak scala, a kompilator nie może odróżnić tego, o którym myślisz. Najczęstszą sugestią jest powrót do wersji SLF4J (jeśli jest to możliwe nawet dla ciebie), w której ta przeciążona niejednoznaczność metody nie istnieje. Więcej informacji można znaleźć na poniższych linków:

https://groups.google.com/forum/?fromgroups#!topic/scala-language/ms4IVIu-xGw

https://github.com/typesafehub/scalalogging/issues/16

+0

Świetna odpowiedź. Wycofanie się nie jest dla mnie opcją. Rock: Hard Place. Wygląda na to, że muszę zrezygnować z API SLF4J i uzyskać moje varargi-ness z Scala's String.format. Zrobiłem benchmarki w przeszłości "{}" SLF4J vs Java's String.format i SL4J wyszedł na wierzch. Szkoda, że ​​utknąłem na ścieżce najniższej wydajności. Może nadszedł czas, aby ponownie uruchomić benchmarki, aby sprawdzić, czy jest tak źle. –

1

Funkcja „szybkie poprawki” do tego jest następujący:

Wystarczy zmusić ostatni argument będzie wpisać dowolny i że rozwiązuje problem kompilator (-y) (i sprawia, że ​​nieco mniej kodu ...)

logger.debug("hello {}/{} ", "Hello", "World":Any) 

lub w przypadku:

log.info("Hello {}. The current time is {}", "robert", new java.util.Date():Any) 
Powiązane problemy