web-dev-qa-db-fra.com

Où / comment log4j recherche-t-il un fichier log4j.properties?

J'essaie log4j dans une application de test simple. Je crée un nouveau Java dans Eclipse et j'ajoute le JAR log4j (v1.2.16) à mon chemin de génération. Je crée ensuite une classe simple qui imprime Hello World. Ensuite, j'utilise le log4j Logger classe pour enregistrer un message d'information. Lorsque j'exécute l'application, je vois le message de journal, en utilisant ce que je suppose être l'appendice et la disposition par défaut. Génial. Ce qui me pose problème, c'est d'ajouter ma propre configuration. c'est ce que j'ai fait:

Créé un fichier log4j.properties avec un appender personnalisé et un niveau de journal et placé dans le dossier src (qui lors de la compilation est copié dans le dossier bin). Exécutez l'application - aucun changement.

J'essaie d'ajouter PropertyConfigurator.configure("log4j.properties"). Exécutez l'application - aucun changement. Aucune erreur, mais aucun changement.

Que dois-je faire pour que log4j charge mon fichier de configuration?

26
Marplesoft

Argh. J'ai découvert que le problème était qu'Eclipse avait importé la mauvaise classe Logger. Il avait importé Java.util.logging.Logger qui a bien sûr sa propre configuration différente de log4j. Eh bien, j'espère que quelqu'un d'autre le fera et le résoudra en lisant cette question.

8
Marplesoft

Pour ceux qui n'ont pas RTFM, regardez sous la rubrique Procédure d'initialisation par défaut , où vous trouverez les éléments suivants:

L'algorithme d'initialisation par défaut exact est défini comme suit:

  1. Réglage du log4j.defaultInitOverride la propriété système à toute autre valeur que "false" fera que log4j sautera la procédure d'initialisation par défaut (cette procédure).
  2. Définissez la variable de chaîne de ressource sur la valeur de log4j.configuration propriété système. La manière préférée de spécifier le fichier d'initialisation par défaut est via le log4j.configuration propriété système. Dans le cas où la propriété système log4j.configuration n'est pas définie, définissez la ressource variable de chaîne sur sa valeur par défaut "log4j.properties ".
  3. Essayez de convertir la variable de ressource en URL.
  4. Si la variable de ressource ne peut pas être convertie en URL, par exemple en raison d'une exception MalformedURLException, recherchez la ressource dans le chemin de classe en appelant org.Apache.log4j.helpers.Loader.getResource (ressource, Logger.class) qui renvoie une URL . Notez que la chaîne "log4j.properties "constitue une URL mal formée. Voir Loader.getResource (Java.lang.String) pour la liste des emplacements recherchés.
  5. Si aucune URL n'a pu être trouvée, abandonnez l'initialisation par défaut. Sinon, configurez log4j à partir de l'URL. PropertyConfigurator sera utilisé pour analyser l'URL pour configurer log4j, sauf si l'URL se termine par le ".xml ", auquel cas le DOMConfigurator sera utilisé. Vous pouvez éventuellement spécifier un configurateur personnalisé. La valeur de log4j.configuratorClass La propriété système est considérée comme le nom de classe complet de votre configurateur personnalisé. Le configurateur personnalisé que vous spécifiez doit implémenter l'interface Configurator.
37
crowne

Vous pouvez activer le débogage interne log4j en définissant le log4j.debug propriété système. Entre autres choses, cela entraînera log4j pour montrer comment il se configure.

Vous pouvez essayer de définir explicitement l'URL du fichier de configuration avec le log4j.configuration propriété système.

Voir aussi: cette question .

7
Jason Day

Le problème peut être dans le classpath, si le classpath a été défini.

La raison pour laquelle il n'a pas été chargé (dans mon cas): il y a eu un conflit entre log4j.properties fichier dans un de mes pots, et il surchargeait celui de mon classpath.

En bref, si votre log4j.properties le fichier ne se charge pas, il pourrait y en avoir un autre ailleurs le remplaçant.

Je pensais juste que je jetterais ça aussi, au cas où quelqu'un d'autre se heurterait à ça. Je viens de passer les 5 dernières heures à essayer de comprendre pourquoi ma valeur par défaut log4j.properties ne se chargerait pas.

5
user2029861

log4j.properties devrait être dans votre chemin de classe. Le "dossier src" qui est copié dans le "dossier bin" (je suppose que vous parlez d'une configuration Eclipse ici), appartient normalement à votre chemin de classe, donc il doit être trouvé (le placez-vous en haut du "src "dossier, non?)

2
leonbloy

Je sais que cela date de quelques mois, mais je ressens le besoin de souligner que le dossier scr n'est pas "copié" dans le dossier bin, ni qu'il fait partie de votre chemin de classe d'exécution .... (le chemin de construction n'est pas chemin de classe d'exécution!). Eclipse compile les fichiers source du dossier src dans le dossier bin (ou ce que vous voulez). C'est le dossier bin qui fait partie de votre chemin de classe d'exécution.

Je voulais juste le souligner, car ces threads sont souvent lus par des programmeurs très juniors également, et je suis toujours frustré que la plupart d'entre eux ne saisissent pas la finesse du chemin de classe Java, et faites donc des erreurs évitables contre elle.

1