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?


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 .


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.)


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


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.