web-dev-qa-db-fra.com

Comment configurer log4j.properties pour SpringJUnit4ClassRunner?

Tout à coup, cela continue pendant un test JUnit. Tout fonctionnait bien, j'ai écrit de nouveaux tests et cette erreur est survenue. Si je le retourne, il ne partira pas. Pourquoi donc?

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.Apache.org/log4j/1.2/faq.html#noconfig for more info.
64
user219882

Les nouveaux tests que vous avez écrits (directement ou indirectement) utilisent les classes qui se connectent à l'aide de Log4j .

Log4J doit être configuré pour que cette journalisation fonctionne correctement.

Placez un fichier log4j.properties (ou log4j.xml) dans la racine de votre chemin de classe de test .

Il devrait avoir une configuration de base telle que

# 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

# An alternative logging format:
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n

Un appender renvoie la console par défaut, mais vous pouvez également définir explicitement la cible de la manière suivante:

log4j.appender.A1.Target=System.out

Cela redirigera toutes les sorties au format Nice vers la console. Plus d'informations peuvent être trouvées ici dans le manuel Log4J ,

Log4J Logging sera alors correctement configuré et cet avertissement disparaîtra.

72
Axel Fontaine

Si vous ne voulez pas vous embêter avec un fichier, vous pouvez faire quelque chose comme ceci dans votre code:

static
{
    Logger rootLogger = Logger.getRootLogger();
    rootLogger.setLevel(Level.INFO);
    rootLogger.addAppender(new ConsoleAppender(
               new PatternLayout("%-6r [%p] %c - %m%n")));
}
48
tster

Ajoutez un fichier log4j.properties (log4j.xml) avec au moins un appender à la racine de votre chemin de classe.

Le contenu du fichier (log4j.properties) peut être aussi simple que

log4j.rootLogger=WARN,A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.Apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.Apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n

Cela activera la journalisation log4j avec le niveau de journalisation par défaut comme WARN et utilisera la console Java pour consigner les messages.

8
Arun P Johny

J'ai le log4j.properties configuré correctement. Ce n'est pas le problème. Après un certain temps, j'ai découvert que le problème était lié à Eclipse IDE), qui comportait une ancienne version dans "cache" et n'en avait pas créé une nouvelle (problème de dépendance Maven). Je devais construire le projet manuellement et maintenant cela fonctionne.

4
user219882

J'utilisais Maven dans Eclipse et je ne voulais pas avoir une copie supplémentaire du fichier de propriétés dans le dossier racine. Vous pouvez effectuer les opérations suivantes dans Eclipse:

  1. Ouvrir la boîte de dialogue d'exécution (cliquez sur la petite flèche à côté du bouton de lecture et accédez aux configurations d'exécution)
  2. Aller sur l'onglet "classpath"
  3. Sélectionnez les "entrées utilisateur" et cliquez sur le bouton "Avancé" sur le côté droit.
  4. Sélectionnez maintenant le bouton radio "Ajouter un dossier externe".
  5. Sélectionnez le dossier de ressources
3
Manu Mukerji

Parce que je n'aime pas avoir les fichiers en double (log4j.properties dans test et main) et que j'ai plusieurs classes de test, chacune s'exécute avec la classe SpringJUnit4ClassRunner, je dois donc la personnaliser. C'est ce que j'utilise :

import Java.io.FileNotFoundException;

import org.junit.runners.model.InitializationError;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Log4jConfigurer;

public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {

    static {
        String log4jLocation = "classpath:log4j-oops.properties";
        try {
            Log4jConfigurer.initLogging(log4jLocation);
        } catch (FileNotFoundException ex) {
            System.err.println("Cannot Initialize log4j at location: " + log4jLocation);
        }
    }

    public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
        super(clazz);
    }
}

Lorsque vous l'utilisez, remplacez SpringJUnit4ClassRunner par MySpringJUnit4ClassRunner

@RunWith(MySpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:conf/applicationContext.xml") 
public class TestOrderController {
    private Logger LOG = LoggerFactory.getLogger(this.getClass());

    private MockMvc mockMvc;
...
}
2
Tiina

Je sais que c'est vieux, mais j'avais aussi des problèmes. Pour Spring 3 utilisant Maven et Eclipse, je devais mettre le fichier log4j.xml dans src/test/resources pour que le test unitaire se connecte correctement. Placer dans la racine du test n'a pas fonctionné pour moi. Espérons que cela aide les autres.

2
Hodglem