2010-12-31 12 views
58

Plötzlich passiert dies während eines JUnit-Tests. Alles hat funktioniert, ich habe neue Tests geschrieben und dieser Fehler ist aufgetreten. Wenn ich es zurückstelle, wird es nicht verschwinden. Warum das?Wie konfiguriere ich log4j.properties für 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. 

Antwort

66

Die neuen Tests, die Sie (direkt oder indirekt) schrieb verwenden Klassen, die Log4j mit log.

Log4J muss konfiguriert werden, damit diese Protokollierung ordnungsgemäß funktioniert.

Setzen Sie eine log4j.properties (oder log4j.xml) Datei in der Wurzel Ihres Test Classpath.

Es sollte einige grundlegende Konfiguration haben wie

# 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 

Ein appender Ausgänge an die Konsole standardmäßig, aber Sie können auch explizit das Ziel wie folgt festgelegt:

log4j.appender.A1.Target=System.out 

Dies wird umleiten alle Ausgabe in einem schönen Format an die Konsole. Weitere Informationen finden Sie hier in der Log4J manual,

Log4J Logging wird dann ordnungsgemäß konfiguriert und diese Warnung wird verschwinden.

+1

Gerade als Referenz, hier ist ein Link für die Umwandlungsmuster Referenz: http: //logging.apache. org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html – lanoxx

+0

Können Sie erklären, warum wir das tun? – iLoveCamelCase

+0

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

8

Fügen Sie eine log4j.properties-Datei (log4j.xml) mit mindestens einem Appender im Stammverzeichnis Ihres Klassenpfads hinzu.

Der Inhalt der Datei (log4j.properties) kann so einfach sein wie

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 

Dies wird log4j Logging mit Standard-Protokollebene als WARN und verwenden Sie die Java-Konsole ermöglichen, die Nachrichten zu protokollieren.

3

Ich habe die log4j.properties richtig konfiguriert. Das ist nicht das Problem. Nach einiger Zeit stellte ich fest, dass das Problem in der Eclipse-IDE war, die einen alten Build-Cache hatte und keinen neuen Build (Maven-Abhängigkeitsproblem) erstellte. Ich musste das Projekt manuell erstellen und jetzt funktioniert es.

+0

Hallo Tom, kannst du dieses Problem und die Problemumgehung näher erläutern - denke, ich erlebe es auch! Danke – VLostBoy

+0

@vlostboy: und die Reinigung des Projekts hat nicht geholfen? – user219882

+0

@vlostboy: Die Lösung, die für mich funktionierte, war der Aufbau von der Kommandozeile: 'mvn clean package' – user219882

44

Wenn Sie nicht mit einer Datei stören möchten, können Sie so etwas wie dies im Code tun:

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

Einen Tag gerettet! Danke @tster. –

3

Ich war mit Maven in Eclipse und ich wollte nicht, eine zusätzliche Kopie haben die Eigenschaftendatei im Stammordner. Sie können die folgenden in Eclipse tun:

  1. öffnen Ausführen-Dialog (klicken Sie auf den kleinen Pfeil neben der Play-Taste und gehen Konfigurationen zu laufen)
  2. Gehen Sie auf die „Classpath“ Tab
  3. Wählen Sie den „User Einträge "und klicken Sie auf die Schaltfläche" Erweitert "auf der rechten Seite.
  4. Wählen Sie nun das Optionsfeld "Externer Ordner hinzufügen".
  5. Wählen Sie den Ressourcen-Ordner
1

Ich weiß, das ist alt, aber ich war zu Schwierigkeiten haben.Für Spring 3, das Maven und Eclipse verwendet, musste ich log4j.xml in src/test/resources für den Komponententest einsetzen, um ordnungsgemäß zu loggen. Das Einbringen in die Wurzel des Tests funktionierte nicht für mich. Hoffentlich hilft das anderen.

2

Weil ich nicht gerne doppelte Dateien (log4j.properties in Test und main) habe, und ich habe ziemlich viele Test-Klassen, die jeweils mit SpringJUnit4ClassRunner-Klasse laufen, so muss ich es anpassen. Dies ist, was ich benutze:

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); 
    } 
} 

Wenn Sie es verwenden, ersetzen SpringJUnit4ClassRunner mit MySpringJUnit4ClassRunner

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

    private MockMvc mockMvc; 
... 
} 
Verwandte Themen