web-dev-qa-db-fra.com

La sortie Log4j n'est pas affichée dans la console Eclipse

Pour une raison quelconque, ma console Eclipse n’affiche plus les instructions Log4j INFO et DEBUG lorsque j’exécute les tests JUnit . En termes de code, aucun changement n’a été apporté, il doit donc être associé à la configuration Eclipse.

Tout ce que je fais dans mon test d'unité est le suivant et, pour une raison quelconque, l'instruction ERROR est UNIQUEMENT affichée dans la console Eclipse. Pourquoi? Où devrais-je chercher des indices?

public class SampleTest
{
   private static final Logger LOGGER = Logger.getLogger(SampleTest.class);

   @Before
   public void init() throws Exception
   {
       // Log4J junit configuration.
       BasicConfigurator.configure();

       LOGGER.info("INFO TEST");
       LOGGER.debug("DEBUG TEST");
       LOGGER.error("ERROR TEST");
   }
}

Détails:

  • log4j-1.2.6.jar
  • junit-4.6.jar Eclipse
  • Développeurs IDE pour Java, version: Version Helios, ID de construction: 20100617-1415
24
javaExpert

Accédez à Exécuter les configurations dans votre Eclipse, puis les arguments -VM ajoutent ceci: 

remplacez log4j-config_folder par votre structure de dossiers dans laquelle vous avez votre fichier log4j.xml

19
Huzi--- Javiator

Recherchez dans le fichier log4j.properties ou log4j.xml le niveau de journalisation. Il est probablement défini sur ERROR au lieu de DEBUG

10
Aaron Digulla

La configuration avec BasicConfigurator.configure(); configure un appender de console de base défini lors du débogage. Un projet avec la configuration ci-dessus et aucun autre code (à l'exception d'un test) ne devrait générer trois lignes de journalisation dans la console. Je ne peux rien dire d'autre que "ça marche pour moi".

Avez-vous essayé de créer un projet vide avec juste log4j et junit, avec seulement le code ci-dessus et l’exécutez?

De plus, pour que la méthode @Before soit exécutée:

@Test
public void testname() throws Exception {
    assertTrue(true);
}

MODIFIER:

Si vous exécutez plus d'un test à la fois, chacun d'entre eux appellera init avant l'exécution.

Dans ce cas, si vous aviez deux tests, le premier aurait un enregistreur et le second appellerait init de nouveau, ce qui le relierait deux fois (essayez-le). Vous devriez obtenir 9 lignes de connexion à la console avec deux tests.

Vous voudrez peut-être utiliser une méthode d'initialisation statique annotée avec @BeforeClass pour éviter cela. Bien que cela se produise également pour tous les fichiers, vous pouvez consulter la documentation sur TestSuites dans JUnit 4. Et/ou appeler BasicConfigurator.resetConfiguration(); dans une classe annotée @AfterClass pour supprimer tous les enregistreurs après chaque classe/suite de tests.

De plus, le consignateur racine est réutilisé. Ainsi, si vous définissez son niveau dans une méthode de test qui s'exécute tôt, il conservera ce paramètre pour tous les autres tests exécutés ultérieurement, même s'ils se trouvent dans des fichiers différents. (ne se produira pas lors de la réinitialisation de la configuration).

Testcase - cela entraînera 9 lignes de journalisation:

import static org.junit.Assert.assertTrue;

import org.Apache.log4j.BasicConfigurator;
import org.Apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;

public class SampleTest
{
   private static final Logger LOGGER = Logger.getLogger(SampleTest.class);

   @Before
   public void init() throws Exception
   {
       // Log4J junit configuration.
       BasicConfigurator.configure();
   }

   @Test
    public void testOne() throws Exception {
       LOGGER.info("INFO TEST");
       LOGGER.debug("DEBUG TEST");
       LOGGER.error("ERROR TEST");

       assertTrue(true);
    }

   @Test
   public void testTwo() throws Exception {
       LOGGER.info("INFO TEST");
       LOGGER.debug("DEBUG TEST");
       LOGGER.error("ERROR TEST");

       assertTrue(true);
   }
}

Changer la méthode init réduit aux six lignes exceptées:

@BeforeClass
public static void init() throws Exception
{
    // Log4J junit configuration.
    BasicConfigurator.configure();
}

Votre problème est probablement dû à une autre classe de test ou suite de tests dans laquelle le niveau de journalisation du consignateur racine est défini sur ERROR et n'est pas réinitialisé.

Vous pouvez également tester cela en réinitialisant la méthode @BeforeClass avant de configurer la journalisation.

Sachez que ces modifications peuvent interrompre la journalisation attendue pour d'autres cas de test jusqu'à ce qu'elle soit corrigée à tous les emplacements. Je suggère d'essayer comment cela fonctionne dans un espace de travail/projet séparé pour avoir une idée de la façon dont cela fonctionne.

9
Tormod

Une chose à noter, si vous avez un fichier log4j.properties sur votre chemin de classe, vous n'avez pas besoin d'appeler BasicConfigurator. Une description de la configuration du fichier de propriétés est ici .

Vous pouvez déterminer si votre IDE est à l'origine du problème en essayant d'exécuter cette classe à partir de la ligne de commande avec log4j.jar et log4j.properties sur votre chemin d'accès aux classes.

6
Jon Freedman

Assurez-vous que lorsque vous exécutez des cas de test junit, vous avez le fichier log4j.properties ou log4j.xml dans votre dossier test/resources.

2
Venkat

Vérifiez votre fichier log4j.properties

Vérifiez exemple simple ici à ici .

2
Maulzey

Je pensais qu'il s'agissait d'un véritable défaut, mais il s'est avéré que la taille de ma console était limitée et que l'ancien contenu de plus de 80000 caractères a été coupé.

Cliquez avec le bouton droit sur la console pour définir les préférences et augmentez la taille maximale de la console.

2
Kiren

On dirait que log4j prend un autre fichier de configuration que celui que vous croyez.

Placez un point d'arrêt dans log4j où le fichier est ouvert et examinez les fichiers getAbsolutePath ().

1

Ajoutez une dépendance de test à votre pom pour slf4j.

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
            <scope>test</scope>
        </dependency>
1
cajunesque

Recherchez les fichiers de configuration log4j dans votre répertoire de sortie (c'est-à-dire bin ou target/classes) ou dans les artefacts de projet générés (.jar/.war/.ear). Si cela se trouve sur votre chemin de classe, il est récupéré par log4j.

1
Adriaan Koster

Une fois, j’ai eu un problème comme celui-ci, lorsque j’ai téléchargé une librairie d’Amazon (pour les services Web d’Amazon) et que ce fichier jar contenait un fichier log4j.properties et qu’il était utilisé à la place de mon bon vieux log4j auto-configuré. Ça vaut le coup.

0
Zsolt János

Il y a un cas que je fais: l'exception se produit quelque part, mais j'ai attrapé l'exception sans rien imprimer, donc le code n'a même pas atteint le code log4j, donc aucune sortie.

0
Eric Wang

Vérifiez que votre log4j.properties ou log4j.xml est copié dans votre chemin de classe IDE et chargé lors de l'appel de BasicConfigurator.configure()

0
Bivas

si le fichier log4j.xml ne se trouve pas dans le projet et que vous utilisez Tomcat, essayez d'accéder à l'instance Tomcat et recherchez log4j. Essayez de changer le niveau consoleAppender pour déboguer et redéployer l'application dans Tomcat. Cela pourrait aider.

0
Rajan

La fenêtre de la console Eclipse a une propriété de filtre (dans certains cas, seul system.err est actif). 

Cliquez droit dans la fenêtre de la console Eclipse -> Préférences -> Console et assurez-vous que la case à cocher 

Affiche quand le programme écrit en sortie standard 

c'est actif.

Sinon, vous pouvez configurer log4j pour écrire toujours dans System.err comme ceci:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/">
    <appender name="AppConsole" class="org.Apache.log4j.ConsoleAppender">
        <param name="Target" value="System.err" />
        <param name="Encoding" value="ISO-8859-15" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{dd.MM.yyyy HH:mm:ss} %5p kontext.%c{1}:%L - %m%n" />
        </layout>
    </appender>
    <root>
        <level value="debug" />
        <appender-ref ref="AppConsole" />
    </root>
</log4j:configuration> 
0
Nic W

J'ai eu la même erreur.

J'utilise Jboss 7.1 AS. Dans le fichier de configuration - standalone.xml, éditez la balise suivante. (arrêtez votre serveur et éditez)

     <root-logger>
            <level name="ALL"/>
            <handlers>
                <handler name="CONSOLE"/>
                <handler name="FILE"/>
            </handlers>
    </root-logger>

Le ALL a le rang le plus bas possible et est destiné à activer toute la journalisation.

0
GGN