2012-06-05 11 views
13

Comment Log4j gère-t-il plusieurs log4j.properties dans son chemin de classe? Quel fichier log4j.properties a la priorité? Permettez-moi de décrire le scénario exact.Plusieurs fichiers Log4j.properties dans le chemin de classe

J'ai plusieurs modules maven développés par différentes équipes et chacun d'entre eux a son propre fichier log4j.properties. RootLogger est configuré pour tous ces fichiers log4j.properties avec ConsoleAppender et FileAppenders.

Maintenant, quand Log4j charge quel fichier log4j.properties utilisera-t-il pour configurer les paramètres RootLogger? De même, comment Log4j créera-t-il la hiérarchie Logger? Comment le fichier log4j.properties d'autres fichiers JAR tiers affectera-t-il le processus de journalisation?

Répondre

9

Le premier fichier du classpath sera chargé. Donc, si A.jar et B.jar contiennent un fichier, et A.jar vient avant B.jar dans le classpath, le fichier de A.jar sera chargé. Voilà comment fonctionne le chargeur de classe.

+0

J'ai une exigence spécifique Si je veux charger à la fois le fichier de propriétés comment puis-je achive il? Je veux dire que les fichiers log4j.properties de a.jar et de b.jar devraient être chargés ... Y at-il un moyen? – Gourabp

+0

Pourquoi auriez-vous besoin de les charger tous les deux? L'objectif de l'externalisation de la configuration dans un fichier est de pouvoir configurer la journalisation comme vous le souhaitez. Les fichiers jar ne doivent donc même pas contenir un fichier log4j.xml.Au lieu de cela, ils doivent documenter les enregistreurs qu'ils utilisent (par convention, le nom du consignateur est le nom de la classe), puis l'assembleur de l'application, utilisant les deux fichiers jar, crée son propre fichier de configuration contenant la configuration de toutes les bibliothèques utilisées. application. –

+0

Je veux charger les deux parce que je suis en train d'écrire une API client où je veux enregistrer les journaux spécifiques à l'API client dans un fichier séparé. l'application peut avoir sa propre configuration log4j mais je ne veux pas que le côté client change quoi que ce soit. Je vais juste leur donner l'api jar où l'appi spécifique à l'api et l'enregistreur seront définis. Notez également que je ne veux pas l'atteindre par programmation, je veux le faire par configuration. – Gourabp

2

log4j ver 1.x:

Comme d'autres l'ont dit, log4j recherche le premier fichier de configuration dans le classpath. Voir: http://logging.apache.org/log4j/1.2/manual.html

Mais quand il y a des « log4j.xml » et les fichiers 'log4j.properties de dans le classpath, il semble que l'expérimentation log4j donne la priorité à « log4j.xml » sur « log4j.properties ». Par exemple, log4j semble d'abord rechercher dans le chemin de classe le premier fichier 'log4j.xml'. S'il n'y en a pas, alors log4j semble chercher dans le classpath le premier fichier 'log4j.properties'.

Copier et coller du code ci-dessous peut aider à déterminer quel fichier de configuration est utilisé:

import org.apache.log4j.Logger; 

public class TestLog4j 
{ 

    static 
    { 
    System.out.println("Classpath: [" + System.getProperty("java.class.path") + "]"); 
    System.out.println("Found logging configuration files:"); 
    System.out.println(" log4j.xml: " + Logger.getRootLogger().getClass().getResource("/log4j.xml")); 
    System.out.println(" log4j.properties: " + Logger.getRootLogger().getClass().getResource("/log4j.properties")); 
    } 

    public static void main(String[] args) 
    { 
    System.out.println("main():"); 
    } 
} 

Edit:

log4j ver 2.x:

Le L'ordre de recherche pour le fichier de configuration par défaut est documenté ici: http://logging.apache.org/log4j/2.x/manual/configuration.html

c.-à-d. Pour log4j version 2.x, si aucun fichier de configuration à priorité supérieure n'est trouvé (par ex. log4j2-test. [propriétés | Yam | json | xml]), le fichier log4j2.properties est utilisé s'il se trouve dans le classpath. Notez que log4j2.xml a la priorité la plus basse et ne sera utilisé que si les fichiers de configuration log4j2 'properties', 'yaml' ou 'json' sont tous introuvables.

Remarque: Pour faciliter le débogage des problèmes de configuration de log4j, définissez la propriété 'log4j.debug', par ex. avec:

java -Dlog4j.debug ... 

Voir aussi:How to initialize log4j properly?

+0

on dirait que c'est l'inverse? référez-vous [link] (https://logging.apache.org/log4j/2.x/manual/configuration.html) –

+0

Réponse éditée pour refléter log4j ver 2.x, en ajoutant un lien vers la documentation (merci @chandra_cst) et un débogage supplémentaire allusion. –

Questions connexes