2013-07-18 18 views
12

Devo essere stupido o qualcosa del genere, ma sembra che non sia in grado di utilizzare i metodi di registrazione parametrizzati varargs-utilizing di SLF4J. Un esempio:Registrazione parametrizzata SLF4J utilizzando il metodo varargs

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class LoggingTest { 

    @Test 
    public void loggingTest() { 
     Logger logger = LoggerFactory.getLogger(this.getClass()); 
     int x = 0xdeadbeef; 
     long y = 0xdeadbeef; 

     try { 
      throw new Exception("This is a mighty exception!"); 
     } catch(Exception e) { 
      logger.error("I wanna log {} and {} and {} with backtrace", x, y, 3, e); 
     } 
    } 
} 

Sul metodo di registrazione, eclisse produce un avvertimento:

The method error(String, Object, Object) in the type Logger is not applicable for the arguments (String, int, long, int, Exception) 

e fallisce la compilazione.

Tuttavia, se cambio la chiamata di registrazione a:

logger.error("I wanna log {} and {} and {} with backtrace", new Object[]{x, y, 3, e}); 

Si compila e viene eseguito come previsto (la registrazione 3 "variabili" e la traccia dello stack eccezione).

Le versioni della libreria sono: slf4j-api-1.7.5.jar, slf4j-log4j12-1.7.5.jar e log4j-1.2.14.jar, se fa alcuna differenza.

Se qualcuno sottolinea le carenze delle mie capacità di pensiero, sarebbe molto apprezzato!

+0

Hai 3 segnaposto nella stringa, ma 4 argomenti - è di proposito? – fge

+1

Sì: http://slf4j.org/faq.html#paramException – Manjabes

+0

Penso che [questa risposta] (http://stackoverflow.com/a/7689819/1523342) lo spieghi molto bene. – mthmulders

risposta

20

ho fatto qualche ulteriori indagini, e l'unico modo per ottenere un errore di compilazione per

logger.error("I wanna log {} and {} and {} with backtrace", x, y, 3, e); 

e non per

logger.error("I wanna log {} and {} and {} with backtrace", new Object[]{x, y, 3, e}); 

è quello di utilizzare una versione del SLF4J API prima del 1.7 (in cui è stato introdotto il supporto per vararg). Probabilmente bisogno di scavare nel classpath (o runtime del server?) Per trovare dove la seguente dichiarazione non riesce ad essere vero:

Le versioni della libreria sono: slf4j-api-1.7.5.jar, slf4j-log4j12- 1.7.5.jar e log4j-1.2.14.jar, se fa alcuna differenza.

(perché rende certamente proprio la differenza che hai osservato)

Problemi correlati