web-dev-qa-db-fra.com

Aucun ajout n'a été trouvé pour l'enregistreur (log4j)?

J'ai mis log4j dans mon chemin de construction, mais le message suivant s'affiche lorsque j'exécute mon application:

log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.Apache.org/log4j/1.2/faq.html#noconfig for more info.

Que signifient ces avertissements? Quel est l'appender ici?

323
maximus

Ce brève introduction à log4j guide est un peu ancien mais reste valable.

Ce guide vous expliquera comment utiliser les enregistreurs et les appenders.


Pour vous aider, vous avez deux approches simples à prendre.

La première consiste simplement à ajouter cette ligne à votre méthode principale:

BasicConfigurator.configure();

La deuxième approche consiste à ajouter ce fichier standard log4j.properties (tiré du guide mentionné ci-dessus) à votre chemin de classe:

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.Apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.Apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
410
maba

Il semble que vous deviez ajouter l'emplacement de votre fichier log4j.properties au chemin d'accès aux classes dans Eclipse.

Assurez-vous que votre projet est ouvert dans Eclipse, puis cliquez sur le menu "Exécuter" en haut d'Eclipse et cliquez sur les éléments suivants:

  1. Courir
  2. Exécuter les configurations
  3. Classpath (onglet)
  4. Entrées utilisateur
  5. Avancé (bouton à droite)
  6. Ajouter des dossiers
  7. accédez ensuite au dossier contenant votre fichier log4j.properties.
  8. Appliquer
  9. Courir

Le message d'erreur ne devrait plus apparaître.

72
JDJ

Solution rapide:

  1. ajouter du code à fonction principale:

    String log4jConfPath = "/path/to/log4j.properties";
    PropertyConfigurator.configure(log4jConfPath);
    
  2. créer un fichier nommé log4j.properties à / path/to

    log4j.rootLogger=INFO, stdout
    log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
    
41
lancerex

Ceci est juste un avertissement.

Fixation

Cela se produit lorsque les fichiers de configuration par défaut log4j.properties et log4j.xml ne peuvent pas être trouvés et que l'application n'effectue aucune configuration explicite.

Pour résoudre ce problème, créez/copiez simplement log4j.properties ou log4j.xml dans votre emplacement sur le chemin de classe (généralement identique à la fichiers jar).

Définissez éventuellement Java option: -Dlog4j.configuration=file:///path/to/log4j.properties.

log4j utilise Thread.getContextClassLoader().getResource() pour localiser les fichiers de configuration par défaut et ne vérifie pas directement le système de fichiers. Connaître l'emplacement approprié pour placer log4j.properties ou log4j.xml nécessite de comprendre la stratégie de recherche du chargeur de classes utilisé. log4j ne fournit pas de configuration par défaut car la sortie sur la console ou le système de fichiers peut être interdite dans certains environnements.

Débogage

Pour le débogage, vous pouvez utiliser le paramètre -Dlog4j.debug=true.

Configuration de log4j.properties

Exemple de configuration de log4j.properties:

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.Apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.Apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN

Voici un autre fichier de configuration qui utilise plusieurs ajouts:

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Apache Solr

Si vous utilisez Solr , copiez <solr>/example/resources/log4j.properties dans un emplacement du chemin de classe .

Exemple de configuration de log4j.properties de Solr ressemble à ceci:

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.Apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.Apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.Apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.Apache.zookeeper=WARN
log4j.logger.org.Apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.Apache.solr.update.LoggingInfoStream=OFF

Voir également:

33
kenorb

La plupart des réponses suggèrent que le fichier log4j.properties soit placé au bon endroit (pour le projet maven, il devrait se trouver dans src/main/resources).

Mais pour moi, le problème est que mon log4j.properties n'est pas correctement configuré. Voici un échantillon qui fonctionne pour moi, vous pouvez l'essayer en premier.

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
7
Searene

Vous utilisez le Logger dans votre code pour consigner un message. La Appender est un objet ajouté à un Logger pour écrire le message sur une cible spécifique. Il y a FileAppender pour écrire dans des fichiers texte ou le ConsoleAppender pour écrire dans la console. Vous devez afficher votre code de configuration de Logger et Appender pour obtenir de l'aide.

veuillez lire le tutorial pour une meilleure compréhension de l'interaction de Logger et Appender.

7
Simulant

Comme expliqué précédemment, il y a 2 approches

La première consiste simplement à ajouter cette ligne à votre méthode principale:

BasicConfigurator.configure();

La deuxième approche consiste à ajouter ce fichier log4j.properties standard à votre chemin de classe:

Lors de la seconde approche, vous devez vous assurer d’initialiser le fichier correctement, par exemple.

Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");

Assurez-vous de créer le dossier requis pour stocker les fichiers journaux.

7
AkashK

Assurez-vous que le fichier de propriétés est correctement défini. Et encore une fois, il semble que le compilateur ne puisse pas trouver le fichier de propriétés, vous pouvez le définir comme suit au pom (uniquement lorsque vous utilisez le projet maven).

<build>
       <sourceDirectory> src/main/Java</sourceDirectory>
       <testSourceDirectory> src/test/Java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >
5
belvey

J'ai la même erreur. Voici le problème qui conduit à ce message d'erreur:

Je crée des objets qui utilisent le Logger avant de configurer le log4j:

Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);

Solution: configurez log4j au début dans la méthode principale:

PropertyConfigurator.configure(xmlLog4JConfigFile); 
// or BasicConfigurator.configure(); if you dont have a config file
5
a3po2.0

Je pense que vous devez comprendre où le fichier jar log4j ou le code Java recherche les fichiers de configuration log4j.

src/main/resources/log4j.properties est le chemin Eclipse. Placez-les à un emplacement approprié afin de ne pas avoir à coder en dur le chemin absolu dans le code.

Lisez mon article et mon exemple de solution pour cela http://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/

3
Jin Thakur

Ajoutez ce qui suit comme premier code:

Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
3
fty4

Une autre raison pour laquelle cela peut se produire (dans RCP4) est que vous utilisez plusieurs infrastructures de journalisation dans votre fichier cible. À titre d'exemple, cela se produira si vous utilisez une combinaison de slf4j, log4j et ch.qos.logback.slf4j dans l'onglet de contenu des fichiers cible.

2
ekjcfn3902039

Dans mon cas, l'erreur était le drapeau "additivité". S'il s'agit de "false" pour votre package de projet racine, les packages enfants n'auront pas d'appendeur et vous verrez l'erreur "appender introuvable)".

2
Antonio Martin

J'ai rencontré le même problème lorsque j'utilise log4j2. Mon problème est dû à l'utilisation d'une mauvaise bibliothèque dépendante:

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <scope>runtime</scope>
    </dependency>

Au lieu de cela, je devrais utiliser:

<dependency>
        <groupId>org.Apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <scope>runtime</scope>
    </dependency>

Dans mon cas, j'ai un log4j2.xml défini dans mon répertoire "ressources", et spécifié pour l'utiliser par:

System.setProperty("log4j.configurationFile", "log4j2.xml");
1
John Zhang

La raison peut être le manque de la Parole static dans certaines:

final static Logger logging = Logger.getLogger(ProcessorTest.class);

Si je fais de logger le champ d'instance, je reçois exactement cet avertissement:

No appenders could be found for logger (org.Apache.kafka.producer.Sender)

Ce qui est pire, les avertissements ne pointent pas vers ProcessorTest, où l’erreur réside, mais vers une classe tout à fait différente (Sender) comme source de problèmes. That la classe a le bon enregistreur et n'a besoin d'aucun changement! Nous pourrions chercher le problème pendant des siècles!

1
Gangnus

Log4J affiche ce message d'avertissement lorsque le code Log4j Java cherche à créer une première ligne de journal dans votre programme.

En ce moment, Log4j fait 2 choses

  1. il recherche pour trouver le fichier log4j.properties
  2. il recherche pour instancier l'appender définir dans log4j.properties

Si log4J ne trouve pas le fichier log4j.properties ou si l'appendeur déclaré dans log4j.rootlogger n'est pas défini ailleurs dans le fichier log4j.properties, le message d'avertissement s'affiche.

ATTENTION: le contenu du fichier de propriétés doit être correct.

Le contenu suivant n'est pas correct

log4j.rootLogger=file

log4j.appender.FILE=org.Apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.Apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

parce que file appender est déclaré dans LOWER-CASE dans l'instruction log4j.rootlogger et défini dans l'instruction log4j.appender à l'aide de UPPER-CASE!

Un fichier correct serait

log4j.rootLogger=FILE

log4j.appender.FILE=org.Apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.Apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

Si MAVEN est utilisé, vous devez placer les fichiers log4j.properties dans src/main/resources ET lancer une génération MAVEN.

Le fichier Log4j.properties est ensuite copié dans le dossier target/classes.

Log4J utilise le fichier log4j.properties trouvé dans target/classes!

1
schlebe

J'ai rencontré ce problème lorsque j'ai essayé de créer un fichier jar exécutable avec maven dans intellij 12. Il s'est avéré que, comme le fichier manifeste Java ne contenait pas de chemin d'accès aux classes, le fichier de propriétés log4j était introuvable. le niveau racine (à partir duquel le fichier jar a été exécuté.)

FYI je obtenais le logger comme ceci:

Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);

Et j’ai réussi à le faire fonctionner avec un fichier pom contenant:

         <plugin>
            <artifactId>maven-Assembly-plugin</artifactId>
            <version>2.2-beta-5</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath> 
                        <mainClass>com.mycompany.mainPackage.mainClass</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>.</Class-Path> <!-- need to add current directory to classpath properties files can be found -->
                    </manifestEntries>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-Assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
1
jmort

Assurez-vous que votre projet est ouvert dans Eclipse, puis cliquez sur le menu "Exécuter" en haut d'Eclipse et cliquez sur les éléments suivants:

  1. Courir

  2. Exécuter les configurations

  3. Classpath (onglet)

  4. Entrées utilisateur

  5. ajouter un pot à droite

  6. ajouter le fichier jar log4j

  7. Appliquer

  8. Courir

Le message d'erreur ne devrait plus apparaître.

1
Varaj Vignesh

La solution sur ce site a fonctionné pour moi https://crunchify.com/Java-how-to-configure-log4j-logger-property-correctly/ . Je ne vois plus aucun avertissement de log4j

Je mets cela dans un fichier log4j.properties que je mets dans src/main/resources

# This sets the global logging level and specifies the appenders
log4j.rootLogger=INFO, theConsoleAppender

# settings for the console appender
log4j.appender.theConsoleAppender=org.Apache.log4j.ConsoleAppender
log4j.appender.theConsoleAppender.layout=org.Apache.log4j.PatternLayout
log4j.appender.theConsoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
0
ihossain

si vous travaillez avec de nombreux projets, vous risquez de rencontrer un problème de style.

* vous devez avoir un fichier lof4j.properties et ce fichier est inclus les propriétés de journalisation d'un autre projet.

* À côté, vous pouvez essayer de placer les fichiers de propriétés log4j dans le chemin src lorsque le projet est exécuté. Les systèmes d’exploitation Linux, les bibliothèques d’autres projets et les fichiers log4.properties peuvent se trouver dans un dossier situé à l’emplacement du classpath.

0
yasin

Mon installation Eclipse n'a pas pu trouver log4j.properties lors de l'exécution de JUnit teste à partir d'Eclipse, même si le fichier se trouvait à src/test/resources.

La raison en était que Eclipse (ou le connecteur m2e) ne copiait pas le contenu de src/test/resources dans le dossier de sortie attendu target/test-classes - la cause principale était celle des propriétés du projet sous - Chemin de construction Java -> Source onglet -> Dossiers sources sur le chemin de construction -> src/test/resources, en quelque sorte il y avait une entrée Excluded: **. J'ai enlevé cette entrée exclue.

Alternativement, j'aurais pu copier manuellement src/test/resources/log4j.properties vers target/test-classes/log4j.properties.

0
Abdull

J'ai rencontré le même problème lorsque j'ai essayé d'exécuter la classe de test JUnit.

Le problème est résolu après avoir ajouté manuellement le fichier log4j.properties dans le dossier src/test/resources.

L'ajout du code ci-dessous au fichier log4j.properties a résolu le problème:

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.Apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
0
Yamuna Erraguntla

J'ai eu ce problème également. J'ai juste oublié de marquer le répertoire des ressources dans IntelliJ IDEA

  1. Clic droit sur votre répertoire
  2. Marquer le répertoire comme
  3. Ressources racine
0
Sadap

Si log4j.properties est bien sur le chemin d'accès aux classes, vous utilisez Spring Boot pour créer un fichier WAR à déployer sur un serveur d'applications, vous omettez un fichier web.xml en faveur de la configuration automatique de Spring Boot, et vous ne l'êtes pas. Pour obtenir des messages de log que ce soit, vous devez configurer explicitement Log4j. En supposant que vous utilisez Log4j 1.2.x:

public class AppConfig extends SpringBootServletInitializer {

    public static void main( String[] args ) {
        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run( AppConfig.class, args );
    }

    @Override
    protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
        InputStream log4j = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
        PropertyConfigurator.configure(log4j);
        return application;
    }

// Other beans as required...
}
0
Brian Schalme

Peut-être ajouter le projet correspondant contenant log4j dans Java chemin de construction, j'y ajoute mahout_h2o lorsque j'ai rencontré ce problème dans un projet mahout utilisant Eclipse, cela fonctionne!

0
NightWind

Première importation:

 import org.Apache.log4j.PropertyConfigurator;

Ajoutez ensuite le code ci-dessous à la méthode principale:

String log4jConfPath ="path to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);

Créez un fichier à l'emplacement chemin d'accès et ajoutez le code ci-dessous à ce fichier.

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
0
himansug