Wo konfiguriere ich log4j in einer JUnit-Testklasse?

85

Mit Blick auf den letzten JUnit-Testfall, den ich geschrieben habe, habe ich die BasicConfigurator.configure () -Methode von log4j im Klassenkonstruktor aufgerufen. Das funktionierte gut, wenn nur diese einzelne Klasse mit dem Eclipse-Befehl "Als JUnit-Testfall ausführen" ausgeführt wurde. Aber mir ist klar, dass es falsch ist: Ich bin mir ziemlich sicher, dass unsere Haupttestsuite alle diese Klassen von einem Prozess aus ausführt, und daher sollte die log4j-Konfiguration irgendwo weiter oben erfolgen.

Aber ich muss noch einige Male einen Testfall selbst ausführen. In diesem Fall möchte ich log4j konfigurieren. Wo soll ich den Konfigurationsaufruf platzieren, damit er ausgeführt wird, wenn der Testfall eigenständig ausgeführt wird, aber nicht, wenn der Testfall als Teil einer größeren Suite ausgeführt wird?

Skiphoppy
quelle
Ich werde log4j 1.x hier annehmen, nicht 2 ...
Rogerdpack

Antworten:

50

Die LogManagerKlasse bestimmt, welche log4j-Konfiguration in einem statischen Block verwendet werden soll , der beim Laden der Klasse ausgeführt wird. Es gibt drei Optionen für Endbenutzer:

  1. Wenn Sie log4j.defaultInitOverridefalse angeben , wird log4j überhaupt nicht konfiguriert.
  2. Geben Sie den Pfad zur Konfigurationsdatei manuell selbst an und überschreiben Sie die Klassenpfadsuche. Sie können den Speicherort der Konfigurationsdatei direkt angeben, indem Sie das folgende Argument verwenden, um java:

    -Dlog4j.configuration=<path to properties file>

    in Ihrer Testläufer-Konfiguration.

  3. Lassen Sie log4j während Ihres Tests den Klassenpfad nach einer log4j-Konfigurationsdatei durchsuchen. (der Standard)

Siehe auch die Online-Dokumentation .

Paul Morie
quelle
Woher weiß es, dass es sich um eine "log4j-Konfigurationsdatei" handelt? Wie lautet der Dateiname? (log4j.xml?)
Chad
1
@Chad: Ich habe meine Antwort bearbeitet, um Ihre Frage zu beantworten. Bitte sehen Sie den Link zum statischen Block, um genau zu sehen, wie dies implementiert wird.
Paul Morie
Ich verwende log4j2 und musste die folgende Einstellung verwenden, um eine Datei anzugeben : -Dlog4j.configurationFile=log4j2.xml. Wenn Sie versuchen, das Laden / Starten zu debuggen, kann diese Einstellung hilfreich sein : -Dlog4j2.debug=true.
Kent
Gibt es eine Möglichkeit, diese Antwort etwas genauer zu formulieren?
März 20/18
61

Im Allgemeinen füge ich einfach eine log4j.xml-Datei in src / test / resources ein und lasse log4j sie selbst finden: Kein Code erforderlich, die Standard-log4j-Initialisierung nimmt sie auf. (Normalerweise möchte ich meine eigenen Logger sowieso auf 'DEBUG' setzen.)

araqnid
quelle
6
Für Standard-Gebäudetests würde ich Log4j auf Warnung oder sogar Fehler setzen. Wenn die Tests erfolgreich sind (auch negative Tests), sollte keine Protokollierung erfolgen, was die Aufmerksamkeit des Benutzers auf sich zieht.
Keiki
2
Ja, das ist richtig für log4j 1.x. Für log4j2 können Sie anscheinend mehr "exotische" Dateien wie die Datei log4j2-test.properties verwenden ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack
6

Vielleicht möchten Sie sich mit Simple Logging Facade für Java (SLF4J) befassen . Es ist eine Fassade, die sich um Log4j dreht und keinen ersten Setup-Aufruf wie Log4j erfordert. Es ist auch ziemlich einfach, Log4j für Slf4j auszutauschen, da die API-Unterschiede minimal sind.

James McMahon
quelle
5

Ich verwende Systemeigenschaften in log4j.xml:

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

und starten Sie Tests mit:

<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
quelle