Gdzie mogę skonfigurować log4j w klasie testowej JUnit?

85

Patrząc na ostatni napisany przeze mnie przypadek testowy JUnit, wywołałem metodę Log4j BasicConfigurator.configure () wewnątrz konstruktora klasy. To działało dobrze w przypadku uruchamiania tylko tej jednej klasy z polecenia Eclipse „uruchom jako przypadek testowy JUnit”. Ale zdaję sobie sprawę, że to niepoprawne: jestem prawie pewien, że nasz główny zestaw testów uruchamia wszystkie te klasy z jednego procesu, dlatego konfiguracja log4j powinna się odbywać gdzieś wyżej.

Ale nadal muszę czasami uruchamiać samodzielnie przypadek testowy, w takim przypadku chcę skonfigurować log4j. Gdzie należy umieścić wywołanie konfiguracji, aby było uruchamiane, gdy przypadek testowy jest uruchamiany samodzielnie, ale nie, gdy przypadek testowy jest uruchamiany jako część większego zestawu?

skiphoppy
źródło
Założę

Odpowiedzi:

51

Te LogManagerokreśla, które log4j config klasy do wykorzystania w bloku statycznego czyli gdy klasa jest ładowana. Istnieją trzy opcje przeznaczone dla użytkowników końcowych:

  1. Jeśli określisz log4j.defaultInitOverride false, w ogóle nie skonfiguruje log4j.
  2. Określ ręcznie ścieżkę do pliku konfiguracyjnego i zastąp wyszukiwanie ścieżki klas. Lokalizację pliku konfiguracyjnego można określić bezpośrednio, używając następującego argumentu, aby java:

    -Dlog4j.configuration=<path to properties file>

    w konfiguracji programu uruchamiającego testy.

  3. Zezwól log4j na skanowanie ścieżki klas w poszukiwaniu pliku konfiguracyjnego log4j podczas testu. (domyślny)

Zobacz także dokumentację online .

Paul Morie
źródło
Skąd będzie wiedzieć, że to „plik konfiguracyjny log4j”? Jaka jest nazwa pliku? (log4j.xml?)
Czad,
1
@Chad: Zmodyfikowałem swoją odpowiedź, aby odpowiedzieć na Twoje pytanie. Zobacz link do statycznego bloku, aby zobaczyć dokładnie, jak to jest zaimplementowane.
Paul Morie
Używam log4j2 i musiałem użyć następujące ustawienia, aby wskazać plik: -Dlog4j.configurationFile=log4j2.xml. Ponadto, jeśli próbujesz debugowania załadunku / startup, ustawienie to może być użyteczne: -Dlog4j2.debug=true.
Kent
Jest jakiś sposób, aby być bardziej szczegółowym w tej odpowiedzi?
markthegrea
61

Generalnie po prostu umieszczam plik log4j.xml w src / test / resources i pozwalam log4j znaleźć go sam: nie jest wymagany żaden kod, domyślna inicjalizacja log4j podniesie go. (I tak zazwyczaj chcę ustawić własne loggery na „DEBUG”)

araqnid
źródło
6
W przypadku standardowych testów budowlanych ustawiłbym Log4j na ostrzeżenie lub nawet błąd. Jeśli testy zakończą się sukcesem (również testy negatywne), nie powinno być żadnego logowania, co przyciąga uwagę użytkowników.
keiki
2
Tak, to prawda dla log4j 1.x. Najwyraźniej w przypadku log4j2 możesz użyć bardziej „egzotycznych” plików, takich jak plik log4j2-test.properties ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack
6

Możesz zajrzeć do Simple Logging Facade for Java (SLF4J) . Jest to fasada otaczająca Log4j, która nie wymaga wywołania wstępnej konfiguracji, takiej jak Log4j. Dość łatwo jest również zmienić Log4j na Slf4j, ponieważ różnice w API są minimalne.

James McMahon
źródło
5

Używam właściwości systemowych w log4j.xml:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

i rozpocznij testy od:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>
gavenkoa
źródło