2010-12-31 14 views
58

Nagle dzieje się to podczas testu JUnit. Wszystko działało, napisałem kilka nowych testów i wystąpił ten błąd. Jeśli to powrócę, to nie zniknie. Dlaczego?Jak skonfigurować log4j.properties dla 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. 

Odpowiedz

66

Nowe testy napisałeś (bezpośrednio lub pośrednio) używać klas, które log w Log4j.

Log4J musi być skonfigurowany, aby to logowanie działało poprawnie.

Umieść plik na log4j.properties (lub log4j.xml) w katalogu głównego testu ścieżki klasy.

Należy mieć podstawową konfigurację takich jak

# 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 

An wyjścia appender do konsoli domyślnie, ale można też jawnie ustawić cel takiego:

log4j.appender.A1.Target=System.out 

To będzie przekierować wszystkie wyjście w przyjemnym formacie do konsoli. Więcej informacji można znaleźć tutaj, w dzienniku Log4J Logging zostanie wtedy poprawnie skonfigurowany i ostrzeżenie zniknie.

+1

Tylko dla odniesienia, tutaj jest link do odniesienia wzór konwersji: http: //logging.apache. org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html – lanoxx

+0

Czy możesz wyjaśnić, dlaczego to robimy? – iLoveCamelCase

+0

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

8

Dodaj plik log4j.properties (log4j.xml) z co najmniej jednym aplikatorem w katalogu głównym ścieżki klas.

Zawartość pliku (log4j.properties) może być tak proste, jak

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 

To umożliwi rejestrowanie log4j z domyślnego poziomu dziennika jak WARN i użyć konsoli java do rejestrowania wiadomości.

3

Mam poprawnie skonfigurowane właściwości log4j.properties. To nie problem. Po pewnym czasie odkryłem, że problem tkwi w Eclipse IDE, który miał starą kompilację w "cache" i nie tworzył nowej (problem Maven dependecy). Musiałem ręcznie zbudować projekt, a teraz działa.

+0

Cześć Tom, czy mógłbyś rozwinąć ten problem i obejść go - myślę, że go również doświadczam! Dzięki – VLostBoy

+0

@vlostboy: czy sprzątanie projektu nie pomogło? – user219882

+0

@vlostboy: Rozwiązaniem, które działało dla mnie było budowanie go z linii komend: 'mvn clean package' – user219882

44

Jeśli nie chcesz męczyć się z pliku, można zrobić coś takiego w kodzie:

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

Uratowałem dzień! Dzięki @tster. –

3

używałem Maven w Eclipse i nie chcą mieć dodatkową kopię plik właściwości w folderze głównym. Można wykonać następujące czynności w Eclipse:

  1. dialogowe Otwórz run (kliknij małą strzałkę obok przycisku odtwarzania i przejść do uruchomienia konfiguracji)
  2. Przejść do „ścieżki klasy” karcie
  3. Wybierz „Użytkownik Wpisy "i kliknij przycisk" Zaawansowane "po prawej stronie.
  4. Teraz wybierz przycisk radiowy "Dodaj folder zewnętrzny".
  5. Wybierz folder zasobów
1

Wiem, że to stary, ale był problem zbyt.W Spring 3 przy użyciu Mavena i Eclipse, musiałem umieścić log4j.xml w src/test/resources, aby test Unit poprawnie się logował. Umieszczenie w katalogu głównym testu nie działa dla mnie. Mam nadzieję, że to pomoże innym.

2

Ponieważ nie lubię mieć duplikatów plików (log4j.properties w teście i main), a ja mam dość wiele klas testowych, każda z nich działa z klasą SpringJUnit4ClassRunner, więc muszę ją dostosować. To co mam użyć:

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

Kiedy go użyć, wymienić SpringJUnit4ClassRunner z MySpringJUnit4ClassRunner

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

    private MockMvc mockMvc; 
... 
} 
Powiązane problemy