Où puis-je configurer log4j dans une classe de test JUnit?

85

En regardant le dernier cas de test JUnit que j'ai écrit, j'ai appelé la méthode BasicConfigurator.configure () de log4j dans le constructeur de classe. Cela a bien fonctionné pour exécuter uniquement cette classe unique à partir de la commande "exécuter comme cas de test JUnit" d'Eclipse. Mais je me rends compte que c'est incorrect: je suis presque sûr que notre suite de tests principale exécute toutes ces classes à partir d'un seul processus, et par conséquent, la configuration de log4j devrait se produire quelque part plus haut.

Mais j'ai encore besoin d'exécuter un cas de test par lui-même quelques fois, auquel cas je veux que log4j soit configuré. Où dois-je placer l'appel de configuration pour qu'il soit exécuté lorsque le scénario de test s'exécute de manière autonome, mais pas lorsque le scénario de test est exécuté dans le cadre d'une suite plus grande?

sauter
la source
Je vais supposer log4j 1.x ici, pas 2 ...
rogerdpack

Réponses:

51

La LogManagerclasse détermine la configuration log4j à utiliser dans un bloc statique qui s'exécute lorsque la classe est chargée. Il existe trois options destinées aux utilisateurs finaux:

  1. Si vous spécifiez log4j.defaultInitOverridefalse, il ne configurera pas du tout log4j.
  2. Spécifiez manuellement le chemin d'accès au fichier de configuration et remplacez la recherche de chemin de classe. Vous pouvez spécifier l'emplacement du fichier de configuration directement en utilisant l'argument suivant pour java:

    -Dlog4j.configuration=<path to properties file>

    dans la configuration de votre testeur.

  3. Autorisez log4j à analyser le chemin d'accès aux classes pour un fichier de configuration log4j pendant votre test. (le défaut)

Voir également la documentation en ligne .

Paul Morie
la source
Comment saura-t-il qu'il s'agit d'un "fichier de configuration log4j?" Quel est le nom du fichier? (log4j.xml?)
Chad
1
@Chad: J'ai modifié ma réponse pour répondre à votre question. Veuillez consulter le lien vers le bloc statique pour voir exactement comment cela est implémenté.
Paul Morie
J'utilise log4j2 et je devais utiliser les paramètres suivants pour indiquer un fichier: -Dlog4j.configurationFile=log4j2.xml. En outre, si vous essayez de déboguer le chargement / démarrage, ce paramètre peut être utile: -Dlog4j2.debug=true.
Kent
Y a-t-il moyen d'être un peu plus précis sur cette réponse?
markthegrea
61

Je mets généralement juste un fichier log4j.xml dans src / test / resources et laisse log4j le trouver par lui-même: aucun code requis, l'initialisation log4j par défaut le récupérera. (Je veux généralement définir mes propres enregistreurs sur 'DEBUG' de toute façon)

araqnid
la source
6
Pour les tests de construction standard, je définirais Log4j sur avertissement ou même erreur. Si les tests réussissent (également des tests négatifs), il ne devrait pas y avoir de journalisation, ce qui attire l'attention des utilisateurs.
keiki
2
Oui, c'est vrai pour log4j 1.x. Pour log4j2, apparemment, vous pouvez utiliser des fichiers plus «exotiques» comme le fichier log4j2-test.properties ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack
6

Vous voudrez peut-être vous pencher sur Simple Logging Facade pour Java (SLF4J) . C'est une façade qui s'enroule autour de Log4j qui ne nécessite pas un appel de configuration initial comme Log4j. Il est également assez facile de remplacer Log4j par Slf4j car les différences d'API sont minimes.

James McMahon
la source
5

J'utilise les propriétés système dans log4j.xml:

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

et commencez les tests avec:

<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
la source