2010-07-30 6 views
0

Nous LIASSES Log4j 1.2.15 avec notre application Swing simple et charger nos propres fichier de propriétés du système de fichiers au démarrage:Log4j: d'où il s'initialise

import org.apache.log4j.*; 

... 
System.setProperty("log4j.defaultInitOverride", "true"); 
... 
File log4jPropertiesFile = ... 
PropertyConfigurator.configure(log4jPropertiesFile.getAbsolutePath()); 
... 

dans les journaux que nous recevons des clients les la sortie ne ressemble pas à ce que nous avons défini dans le fichier de propriétés et nous sommes sûrs que pas plus d'une très petite minorité n'a édité le fichier lui-même.

Se pourrait-il que Log4j remplace en quelque sorte nos paramètres si un autre fichier de configuration présent sur la machine de l'utilisateur est disponible? Comment pouvons-nous empêcher d'utiliser cela?

+0

Vous êtes sûr qu'il existe une méthode PropertyConfigurator.configure (fichier)? Il n'y a pas dans Log4j 1.2.16 API ... – PeterMmm

+0

@PeterMmm: Je suis tombé juste sur cette divergence aussi - avant de remarquer votre commentaire. Le document que j'ai regardé était pour le 1.2.16, donc ce n'est pas loin des OP, et je n'aurais pas dû voir un changement d'API aussi radical. Quelque chose ne va pas ici; J'ai demandé une explication au PO. –

+0

Vous aviez tous les deux raison, mon exemple de code ci-dessus était faux. Nous utilisions le chemin du fichier absolu, pas l'instance du fichier. Je l'ai corrigé. – Mot

Répondre

4

Il y a un paragraphe in the docs détaillant la façon dont Log4j s'initialise:

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

  1. Définition de la propriété du système log4j.defaultInitOverride à toute autre valeur alors "faux" fera que log4j ignore 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 la propriété système log4j.configuration. Le moyen préféré de spécifier le fichier d'initialisation par défaut est la propriété système log4j.configuration. Dans le cas où la propriété système log4j.configuration n'est pas définie, définissez la variable de ressource 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 une URL, par exemple en raison d'une erreur MalformedURLException, recherchez la ressource à partir du chemin de classe en appelant org.apache.log4j.helpers.Loader.getResource (resource, Logger.class) 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 ne peut être trouvée, annulez l'initialisation par défaut. Sinon, configurez log4j à partir de l'URL. Le PropertyConfigurator sera utilisé pour analyser l'URL pour configurer log4j, sauf si l'URL se termine par l'extension ".xml", auquel cas le DOMConfigurator sera utilisé. Vous pouvez éventuellement spécifier un configurateur personnalisé. La valeur de la propriété système log4j.configuratorClass 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 du configurateur.

Ceci est, certes, déroutant comme l'enfer à comprendre. Fondamentalement, la chose la plus simple que vous pouvez faire est de mettre log4j.propertiessur le chemin de classe de votre application, et il sera trouvé. Tout le reste est ... finesse. Personnellement, j'appelle parfois explicitement la classe BasicConfigurator dans mon main, configurant parfois (codé en dur) certaines choses qui pourraient apparaître dans un fichier ... quelle que soit la situation. Vous pouvez initialiser log4j complètement par programme, ce qui rendrait la question du fichier de configuration discutable. Cela rendrait votre configuration complètement moins flexible.

+0

Merci d'avoir répondu, Carl. Nous n'ajoutons pas le 'log4j.properties' au classpath, car l'emplacement d'installation est généralement en lecture seule et je ne me sens pas bien en ajoutant le répertoire settings de notre application (où log4j.properties se trouve) au classpath. – Mot

+0

Je remarque une divergence entre votre extrait de code et la documentation de log4j: 'PropertyConfigurator' ne semble pas avoir de méthode' configure (File) '! Pouvez-vous expliquer cela, et peut-être donner un peu plus de détails? –

+0

Seriez-vous OK avec vos clients qui ne peuvent pas du tout manipuler le fichier 'log4j.properties'? Ensuite, mettez-le dans la racine de votre fichier '.jar'! C'est à la fois sur le classpath et plutôt inaccessible. –