2010-12-31 14 views
58

Improvvisamente questo continua ad accadere durante un test JUnit. Tutto funzionava, ho scritto alcuni nuovi test e questo errore si è verificato. Se lo ripristino, non andrà via. Perché?Come configurare log4j.properties per SpringJUnit4ClassRunner?

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

risposta

66

I nuovi test che hai scritto (direttamente o indirettamente) usano classi che registro utilizzando Log4j.

Log4J deve essere configurato affinché questa registrazione funzioni correttamente.

mettere un file log4j.properties (o log4j.xml) nella root del vostro prova classpath.

dovrebbe avere una configurazione di base come ad esempio

# Set root logger level to DEBUG and its only appender to A1. 
log4j.rootLogger=DEBUG, A1 

# A1 is set to be a ConsoleAppender. 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 

# A1 uses PatternLayout. 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n 

# An alternative logging format: 
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n 

Un uscite Appender alla console di default, ma è anche possibile impostare in modo esplicito l'obiettivo in questo modo:

log4j.appender.A1.Target=System.out 

Questo reindirizzerà tutto uscita in un bel formato per la console. Maggiori informazioni possono essere trovate qui nello Log4J manual,

Log4J La registrazione sarà quindi correttamente configurata e questo avviso scomparirà.

+1

Solo per riferimento, ecco un link per il modello di conversione di riferimento: http: //logging.apache. org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html – lanoxx

+0

Puoi spiegare perché stiamo facendo questo? – iLoveCamelCase

+0

project/src/test/resources/log4j.properties –

8

Aggiungi un log4j.properties (log4j.xml) File con almeno un appender nella root del vostro classpath.

Il contenuto del file (log4j.properties) possono essere semplici come

log4j.rootLogger=WARN,A1 

# A1 is set to be a ConsoleAppender. 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n 

Ciò consentirà la registrazione log4j con il livello di log di default come WARN e utilizzare la console Java per registrare i messaggi.

3

ho la log4j.properties configurati correttamente. Non è questo il problema Dopo un po 'ho scoperto che il problema era nell'IDE di Eclipse che aveva una vecchia build in "cache" e non ne creava uno nuovo (problema di dipendenza da Maven). Ho dovuto costruire il progetto manualmente e ora funziona.

+0

Ciao Tom, potresti approfondire questo problema e aggirare il problema- penso che anch'io lo sto vivendo! Grazie – VLostBoy

+0

@vlostboy: e la pulizia del progetto non è stata d'aiuto? – user219882

+0

@vlostboy: La soluzione che ha funzionato per me è stata la creazione dalla riga di comando: 'pacchetto mvn clean' – user219882

44

Se non si vuole perdere tempo con un file, si può fare qualcosa di simile nel codice:

static 
{ 
    Logger rootLogger = Logger.getRootLogger(); 
    rootLogger.setLevel(Level.INFO); 
    rootLogger.addAppender(new ConsoleAppender(
       new PatternLayout("%-6r [%p] %c - %m%n"))); 
} 
+0

Salvato un giorno! Grazie a @tster. –

3

stavo usando Maven in Eclipse e non volevo avere una copia aggiuntiva di il file delle proprietà nella cartella principale. È possibile effettuare le seguenti operazioni in Eclipse:

  1. finestra di dialogo Apri run (fare clic sulla piccola freccia accanto al pulsante di riproduzione e andare a correre configurazioni)
  2. Vai alla scheda "classpath"
  3. Selezionare la "User Voci "e fare clic sul pulsante" Avanzate "sul lato destro.
  4. Selezionare ora il pulsante di opzione "Aggiungi cartella esterna".
  5. Selezionare la cartella risorse
1

So che questo è vecchio, ma aveva problemi anche.Per Spring 3 che utilizzava Maven ed Eclipse, avevo bisogno di inserire log4j.xml in src/test/resources perché il test dell'unità potesse essere registrato correttamente. Inserirsi nella radice del test non ha funzionato per me. Speriamo che questo aiuti gli altri.

2

Perché non mi piace avere file duplicati (log4j.properties in test e main), e ho parecchie classi di test, ognuna eseguita con SpringJUnit4ClassRunner class, quindi devo personalizzarla. Questo è quello che uso:

import java.io.FileNotFoundException; 

import org.junit.runners.model.InitializationError; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.util.Log4jConfigurer; 

public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
     String log4jLocation = "classpath:log4j-oops.properties"; 
     try { 
      Log4jConfigurer.initLogging(log4jLocation); 
     } catch (FileNotFoundException ex) { 
      System.err.println("Cannot Initialize log4j at location: " + log4jLocation); 
     } 
    } 

    public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
     super(clazz); 
    } 
} 

Quando lo si utilizza, sostituire SpringJUnit4ClassRunner con MySpringJUnit4ClassRunner

@RunWith(MySpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:conf/applicationContext.xml") 
public class TestOrderController { 
    private Logger LOG = LoggerFactory.getLogger(this.getClass()); 

    private MockMvc mockMvc; 
... 
} 
Problemi correlati