76 votes

Est-il possible de faire en sorte que log4j affiche le fichier qu'il a utilisé pour se configurer ?

Question

Est-il possible de faire en sorte que Log4J affiche le chemin complet du fichier utilisé pour la configuration ?


Contexte

J'ai une relation amour-haine avec log4j. Dans les bons moments, il est génial, mais quand il ne fonctionne pas, il peut être l'une des choses les plus difficiles à déboguer. Je gère toute la journalisation de notre application. En tant que tel, je suis très familier avec la journalisation et la fonction procédure d'initialisation par défaut définie dans le manuel. Pourtant, il semble que, toutes les quelques semaines, les coupures de courant et je passe beaucoup de temps pour résoudre le problème.

Cette fois, c'est sévèrement cassé. Chaque déclaration de journal est envoyée à la console et je n'arrive pas à comprendre pourquoi. La même base de code qui utilisait mes fichiers log4j.xml la semaine dernière, utilise soudainement une autre configuration. Rien d'évident n'a changé. Ma seule hypothèse est que quelques dépendances ont changé et je soupçonne Maven d'avoir téléchargé un JAR maléfique qui casse tout.

Si je pouvais juste trouver quel fichier de configuration Log4J a décidé d'utiliser au démarrage je pourrais m'attaquer facilement à ce problème et à la plupart des autres.


Résumé

Existe-t-il un moyen de dire à Log4J d'imprimer le fichier utilisé pour la configuration ? Sinon, existe-t-il un moyen d'interrompre une application en cours d'exécution et d'utiliser le débogueur pour répondre à cette question (peut-être avec une expression ou en inspectant les variables) ?

79voto

matt b Points 73770

Oui, il suffit d'ajouter log4j.debug aux variables système de la JVM. Par exemple :

java -Dlog4j.debug -cp ... some.class.name

Log4j produira alors quelque chose comme ce qui suit :

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@1f7182c1.  
log4j: Using URL [file:/C:/Users/matt/workspace/projectname/target/test-classes/log4j.xml] for automatic log4j configuration.  
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator  
log4j: System property is :null  
log4j: Standard DocumentBuilderFactory search succeded.  
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl  
log4j: debug attribute= "null".  
log4j: Ignoring debug attribute.  
log4j: reset attribute= "false".  
log4j: Threshold ="null".  
...

Pour référence, voir le manuel y la FAQ .

7voto

Ben Points 934

J'utilise Log4J2 et si vous voulez obtenir le fichier à partir de votre programme Java, ceci a fonctionné pour moi :

LoggerContext lContect = LogManager.getContext();
Field f = lContect.getClass().getDeclaredField("configuration");
f.setAccessible(true);
XmlConfiguration iWantThis = (XmlConfiguration) f.get(lContect);
System.out.println("Config File: " + iWantThis.getName());

2voto

Remko Popma Points 19015

L'équivalent log4j 2 pour cela est de mettre <Configuration status="trace"> dans le fichier de configuration. Cela affichera l'emplacement à partir duquel le fichier de configuration de log4j2 est chargé, ainsi que d'autres détails internes du processus de configuration de log4j2. Par défaut, le niveau du journal d'état est WARN, de sorte que vous ne voyez les notifications que lorsqu'il y a un problème.

Si le fichier de configuration n'est pas trouvé correctement, vous pouvez toujours activer l'enregistrement de l'état interne de log4j2 en définissant la propriété du système org.apache.logging.log4j.simplelog.StatusLogger.level à TRACE .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X