Où dois-je placer le fichier log4j.properties?

135

J'ai écrit un projet de service Web en utilisant netbeans 6.7.1 avec glassfish v2.1, mis log4j.properties dans le répertoire racine du projet et utilisez:

static Logger logger = Logger.getLogger(MyClass.class);

dans Constructor:

PropertyConfigurator.configure("log4j.properties");

et dans les fonctions:

logger.info("...");
logger.error("...");
// ...

mais, c'est une information d'erreur (en fait, j'ai essayé de le mettre presque tous les répertoires que je pouvais réaliser):

log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:297)
        at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:315)
        at com.corp.ors.demo.OrsDemo.main(OrisDemo.java:228)
log4j:ERROR Ignoring configuration file [log4j.properties].
log4j:WARN No appenders could be found for logger (com.corp.ors.demo.OrsDemo).
log4j:WARN Please initialize the log4j system properly.

l'exemple de projet peut être obtenu à partir de http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8

mono
la source
2
Quel est le but de PropertyConfigurator.configure ("log4j.properties"); ligne ? Je n'utilise jamais celui-ci. Votre fichier log4j.xml ne doit être "quelque part" que dans votre chemin de classe.
Antoine Claval
1
Regardez stackoverflow.com/questions/1140358/… pour trouver comment la configuration log4j elle-même est enregistrée. Je pense que cela devrait vous aider beaucoup, car certains conteneurs ont leur propre configuration log4j.
dz.
@AntoineClaval J'ai supprimé cette ligne maudite et cela a fonctionné comme un charme. Man, what a ride ..
Siddharth

Réponses:

114

Je sais qu'il est un peu tard pour répondre à cette question, et peut-être que vous avez déjà trouvé la solution, mais je poste la solution que j'ai trouvée (après avoir beaucoup cherché sur Google) donc cela peut aider un peu:

  1. Placez log4j.properties sous WEB-INF \ classes du projet comme mentionné précédemment dans ce fil.
  2. Mettez log4j-xx.jar sous WEB-INF \ lib
  3. Testez si log4j a été chargé: ajoutez -Dlog4j.debug@ la fin de vos options java de tomcat

J'espère que cela aidera.

rgds

manquer
la source
Utilisez la commande 'run' pour obtenir tomcat au premier plan; vous pouvez passer des options java via la ligne de commande. De plus, l'option -x de bash est utile pour voir ce qui arrive exactement à vos options: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM
50

Comme déjà indiqué, log4j.properties doit être dans un répertoire inclus dans le classpath, je veux ajouter que dans un projet mavenized, un bon endroit peut être src/main/resources/log4j.properties

Stivlo
la source
26

Vous pouvez spécifier l'emplacement du fichier de configuration avec l'argument VM -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties"

Makatun
la source
est-ce fichier: / ou fichier: /// ou simplement / chemin / vers / fichier sur un système unix?
morpheus
Pour Windows, c'est juste un fichier: /, je suppose qu'unix est le même
Amalgovinus
C'est la seule réponse qui prenne en compte plusieurs environnements ayant différents niveaux de journalisation.
Matt
Sur macOS, dans jvm.options de Liberty Server, n'utilisez pas de guillemets et utilisez file: ///
wnm3
Juste une mise à jour qui pourrait aider à sauver une certaine frustration: si vous utilisez log4j2, le nom de l'argument a été changé enlog4j.configurationFile
dan.m était user2321368
25

Vous devez le mettre dans le répertoire racine, qui correspond à votre contexte d'exécution.

Exemple:

    MyProject
       src
           MyClass.java
           log4j.properties

Si vous commencez à exécuter à partir d'un autre projet, vous devez avoir ce fichier dans le projet utilisé pour démarrer l'exécution. Par exemple, si un projet différent contient des tests JUnit, il doit également avoir son fichier log4j.properties.


Je suggère d'utiliser log4j.xml au lieu de log4j.properties. Vous avez plus d'options, obtenez de l'aide de votre IDE et ainsi de suite ...

KLE
la source
par exemple, je l'ai presque mis dans chaque répertoire. mais il n'est pas utile de déployer le projet Glassfish, car GF ne copie pas les propriétés dans le bon répertoire. Il semble que GF le perde.
mono
en fait, je pense que le problème vient du déploiement automatique de netbeans. J'essaye de déployer par fichier de guerre dans la console d'administration, c'est ok. Je ne sais pas si j'avais raison. Si j'avais raison, pourquoi netbeans ne déploie pas ces fichiers lors du déploiement automatique du projet.
mono
ça a marché ! mais n'est-ce pas inélégant ... il pense qu'il est mieux placé dans un type de dossier "ressource".
Adams.H
17

Pour un projet basé sur Maven, conservez votre log4j.properties dans src / main / resources. Rien d'autre a faire!

Byorn
la source
C'est tout, et c'est la même chose pour d'autres fichiers de propriétés comme XMLConfiguration dans les projets Maven. Merci!
Ramon
13

Si vous mettez log4j.properties dans src, vous n'avez pas besoin d'utiliser l'instruction -

PropertyConfigurator.configure("log4j.properties");

Il sera pris automatiquement car le fichier de propriétés est dans le chemin de classe.

Ani
la source
10

Essayer:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));
Jhon M
la source
9

Le fichier doit se trouver dans le répertoire WEB-INF / classes. Cette structure de répertoires doit être intégrée au fichier war.

Martin OConnor
la source
en théorie, c'est la réponse, mais le problème est que log4j.properties est perdu lorsque glassfish déploie un fichier de guerre.
mono
3
Il devrait être dans WEB-INF / classes et empaqueté dans le fichier de guerre
Martin OConnor
@mono - au moins dans l'archive téléchargeable, il n'y a AUCUN log4j.properties dans web / WEB-INF / classes. Martin a raison, c'est là que ça devrait être.
fvu
L'astuce est, vous le mettez dans votre dossier src, (Votre dossier source racine), dans le processus de construction de votre code, le fichier est transféré automatiquement dans le dossier classes ...
Mostafa Zeinali
7

Mon IDE est NetBeans. J'ai mis le fichier log4j.property comme indiqué dans les images

Racine

dossier racine du projet

la toile

dossier Web

WEB-INF

Dossier WEB-INF

Pour utiliser ce fichier de propriétés, vous devez écrire ce code:

package example;

import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Logger;
import javax.servlet.*;
public class test {

public static ServletContext context;
static Logger log = Logger.getLogger("example/test");

public test() {

        String homeDir = context.getRealPath("/");
        File propertiesFile = new File(homeDir, "WEB-INF/log4j.properties");
        PropertyConfigurator.configure(propertiesFile.toString());
        log.info("This is a test");
    }
}

Vous pouvez définir un contexte ServletContext statique à partir d'un autre fichier JSP. Exemple:

test.context = getServletContext(); 
test sample = new test(); 

Vous pouvez maintenant utiliser le fichier log4j.property dans vos projets.

Ali Mamedov
la source
5

Quelques réponses spécifiques techniquement correctes déjà fournies mais en général, cela peut être n'importe où sur le chemin des classes d'exécution, c'est-à-dire partout où les classes sont recherchées par la JVM.

Cela peut être le répertoire / src dans Eclipse ou le répertoire WEB-INF / classes dans votre application déployée, mais il est préférable de connaître le concept de chemin de classe et la raison pour laquelle le fichier y est placé, ne traitez pas seulement WEB-INF / classes comme un répertoire "magique".

Brian
la source
5

J'ai passé beaucoup de temps à comprendre pourquoi le fichier log4j.properties n'est pas visible.
Ensuite, j'ai remarqué qu'il n'était visible pour le projet que lorsqu'il se trouvait dans les dossiers MyProject / target / classes / et MyProject / src / main / resources .
J'espère que ça sera utile à quelqu'un.
PS: Le projet était basé sur des maven.

RedCH
la source
3

J'ai trouvé que Glassfish par défaut recherche [emplacement d'installation de Glassfish] \ glassfish \ domaines [votre domaine] \ comme répertoire de travail par défaut ... vous pouvez déposer le fichier log4j.properties à cet emplacement et l'initialiser dans votre code à l'aide de PropertyConfigurator comme mentionné précédemment...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");
Durandal00
la source
1

Je ne sais pas que c'est la bonne manière, mais cela a résolu mon problème. placez le fichier log4j.properties dans "dossier de projet" / config et utilisez PropertyConfigurator.configure ("config // log4j.properties");

cela fonctionnera avec IDE mais pas lorsque vous exécuterez vous-même le fichier jar. lorsque vous exécutez le fichier jar vous-même, copiez simplement le fichier log4j.properties dans le dossier dans lequel se trouve le fichier jar.

sampathpremarathna
la source
1

Mettez log4j.properties dans classpath. Voici les 2 cas qui vous aideront à identifier l'emplacement approprié: 1. Pour les applications Web, le chemin d'accès aux classes est / WEB-INF / classes.

\WEB-INF      
    classes\
        log4j.properties
  1. Pour tester à partir du test principal / unitaire, le chemin de classe est le répertoire source

    \Project\
       src\
          log4j.properties
Sharif
la source
1

Il y a plusieurs façons de le faire:

Way1: Si vous essayez dans un projet maven sans utiliser PropertyConfigurator

Premièrement: vérifiez le répertoire des ressources dans scr / main

  if available,
       then: create a .properties file and add all configuration details.
  else
       then: create a directory named resources and a file with .properties     
write your configuration code/details.

suit la capture d'écran:

! [entrez la description de l'image ici

Way2: Si vous essayez avec le fichier de propriétés pour le projet java / maven, utilisez PropertyConfigurator

Placez le fichier de propriétés n'importe où dans le projet et indiquez le chemin correct. dire: src / javaLog4jProperties / log4j.properties

statique{

 PropertyConfigurator.configure("src/javaLog4jProperties/log4j.properties");

}

entrez la description de l'image ici

Way3: Si vous essayez avec xml sur un projet java / maven, utilisez DOMConfigurator

Placez le fichier de propriétés n'importe où dans le projet et indiquez le chemin correct. dire: src / javaLog4jProperties / log4j.xml

statique{

 DOMConfigurator.configure("src/javaLog4jProperties/log4j.xml");

}

entrez la description de l'image ici

Shivendra Pandey
la source
1

La configuration de votre projet standard aura une structure de projet semblable à:

src/main/java
src/main/resources

Vous placez log4j.properties dans le dossier des ressources, vous pouvez créer le dossier des ressources s'il n'en existe pas

Robert Squire
la source
0

En fait, je viens de rencontrer ce problème dans une structure de projet Java standard comme suit:

\myproject
    \src
    \libs
    \res\log4j.properties

Dans Eclipse, je dois ajouter le dossier res pour construire le chemin, cependant, dans Intellij, je dois marquer le dossier res comme ressources comme le montre la capture d'écran liée: cliquez avec le bouton droit sur le dossier res et marquez comme ressources .

Miracle Chan
la source
0

Vous n'avez pas besoin de spécifier PropertyConfigurator.configure("log4j.properties"); dans votre classe Log4J, si vous avez déjà défini le log4j.properties dans la structure de votre projet.

En cas de projet dynamique Web: -

Vous devez enregistrer votre log4j.properties sous WebContent -> WEB-INF -> log4j.properties

J'espère que cela peut vous aider.

Manish Patel
la source