web-dev-qa-db-fra.com

Comment configurer log4j avec un fichier de propriétés

Comment puis-je obtenir log4j pour récupérer un fichier de propriétés.

J'écris une Java application de bureau que je veux utiliser log4j. Dans ma méthode principale si j'ai ceci:

   PropertyConfigurator.configure("log4j.properties");

Le fichier log4j.properties se trouve dans le même répertoire lorsque j'ouvre le Jar.

Pourtant, je reçois cette erreur:

log4j: ERREUR Impossible de lire le fichier de configuration [log4j.properties]. Java.io.FileNotFoundException: log4j.properties (le système ne peut pas trouver le fichier spécifié)

Qu'est-ce que je fais mal?

24
Dan

Je crois que la méthode configure attend un chemin absolu. Quoi qu'il en soit, vous pouvez également essayer de charger d'abord un objet Propriétés:

Properties props = new Properties();
props.load(new FileInputStream("log4j.properties"));
PropertyConfigurator.configure(props);

Si le fichier de propriétés est dans le pot, vous pouvez faire quelque chose comme ceci:

Properties props = new Properties();
props.load(getClass().getResourceAsStream("/log4j.properties"));
PropertyConfigurator.configure(props);

Ce qui précède suppose que log4j.properties se trouve dans le dossier racine du fichier jar.

47
kgiannakakis

Lorsque vous utilisez PropertyConfigurator.configure (String configFilename), il s'agit de l'opération suivante dans la bibliothèque log4j.

Properties props = new Properties();
FileInputStream istream = null;
try {
  istream = new FileInputStream(configFileName);
  props.load(istream);
  istream.close();
}
catch (Exception e) {
...

Il échoue dans la lecture car il recherche "Log4j.properties" dans le répertoire actuel où l'application est exécutée.

Que diriez-vous de la façon dont il modifie la partie de lecture du fichier de propriétés comme suit et place "log4j.properties" dans le répertoire dans lequel le CLASSPATH est défini.

ClassLoader loader = Thread.currentThread().getContextClassLoader();
URL url = loader.getResource("log4j.properties");
PropertyConfigurator.configure(url);

Il existe une autre méthode pour mettre "Log4j.properties" dans le fichier jar.

jar xvf [YourApplication].jar log4j.properties
13
Yu Sun corn

il suffit de définir -Dlog4j.configuration = fichier: log4j.properties a fonctionné pour moi.

log4j recherche ensuite le fichier log4j.properties dans le répertoire de travail actuel de l'application.

N'oubliez pas que log4j.configuration est une spécification URL , alors ajoutez 'file:' devant votre nom de fichier log4j.properties si vous voulez faire référence à un fichier normal sur le système de fichiers, c'est-à-dire un fichier qui n'est pas sur le chemin de classe!

Initialement, j'ai spécifié -Dlog4j.configuration = log4j.properties. Cependant, cela ne fonctionne que si log4j.properties se trouve sur le chemin de classe. Lorsque j'ai copié log4j.properties dans main/resources dans mon projet et reconstruit de façon à ce qu'il soit copié dans le répertoire cible (projet maven), cela a également fonctionné (ou vous pouvez empaqueter votre log4j.properties dans les bocaux de votre projet, mais cela ne serait pas le cas). permettre à l'utilisateur de modifier la configuration de l'enregistreur!).

7
consultantleon

Il s'agit d'une modification de la réponse de @kgiannakakis: le code d'origine est incorrect car il ne ferme pas correctement InputStream après l'appel de Properties.load(InputStream). Depuis les Javadocs: The specified stream remains open after this method returns.

================================

Je crois que la méthode configure attend un chemin absolu. Quoi qu'il en soit, vous pouvez également essayer de charger d'abord un objet Propriétés:

Properties props = new Properties();
InputStream is = new FileInputStream("log4j.properties");
try {
    props.load(is);
}
finally {
    try {
        is.close();
    }
    catch (Exception e) {
        // ignore this exception
    }
}
PropertyConfigurator.configure(props);

Si le fichier de propriétés est dans le pot, vous pouvez faire quelque chose comme ceci:

Properties props = new Properties();
InputStream is = getClass().getResourceAsStream("/log4j.properties");
try {
    props.load(is);
}
finally {
    try {
        is.close();
    }
    catch (Exception e) {
        // ignore this exception
    }
}
PropertyConfigurator.configure(props);

Ce qui précède suppose que log4j.properties se trouve dans le dossier racine du fichier jar.

4
kevinarpe

J'ai ce code dans ma candidature aujourd'hui

File log4jfile = new File("./conf/log4j.properties");
PropertyConfigurator.configure(log4jfile.getAbsolutePath());

Le chemin relatif provient du répertoire de travail de la JVM (où la JVM démarre).

2
jmq

Je crois que le répertoire log4j.properties doit être dans le Java classpath. Dans votre cas, ajouter le CWD au classpath should fonctionne.

0
qwerty

Étant donné que les arguments JVM sont finalement transmis à votre programme Java en tant que variables système, vous pouvez utiliser ce code au début de votre point d'exécution pour modifier la propriété et demander à log4j de lire la propriété que vous venez de définir dans le système Propriétés

try {
        System.setProperty("log4j.configuration", new File(System.getProperty("user.dir")+File.separator+"conf"+File.separator+"log4j.properties").toURI().toURL().toString());
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
0
user2420019