En essayant d’exécuter les lignes suivantes, seules les deux dernières instructions sont affichées ("Voici quelques erreurs" et "Voici quelques erreurs") et les trois premières instructions ne sont pas affichées.Je venais de commencer à apprendre ce sujet. Pourquoi cela arrive-t-il?
logger.debug("Here is some DEBUG");
logger.info("Here is some INFO");
logger.warn("Here is some WARN");
logger.error("Here is some ERROR");
logger.fatal("Here is some FATAL");
le log4j.property a
log4j.rootLogger=debug,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=[%5p] %d{mm:ss}(%F:%M:%L)%n%m%n%n
Vous avez probablement un fichier log4j.properties quelque part dans le projet. Dans ce fichier, vous pouvez configurer le niveau de sortie de débogage souhaité. Voir cet exemple:
log4j.rootLogger=info, 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 - %m%n
log4j.logger.com.example=debug
La première ligne définit le niveau de journalisation du journal racine sur "info", c’est-à-dire que seules info, warn, error et fatal seront imprimées sur la console (l’appender défini un peu plus bas).
La dernière ligne définit le consignateur pour com.example. * (Si vous obtenez vos consignateurs via LogFactory.getLogger(getClass())
) sera au niveau de débogage, c’est-à-dire que le débogage sera également imprimé.
Voici un rapide hack d'une ligne que j'utilise occasionnellement pour activer temporairement la journalisation du débogage dans un test JUnit:
Logger.getRootLogger().setLevel(Level.DEBUG);
Mettez un fichier nommé log4j.xml
dans votre chemin de classe. Le contenu est par exemple.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/">
<appender name="stdout" class="org.Apache.log4j.ConsoleAppender">
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{1}:%L - %m%n"/>
</layout>
</appender>
<root>
<level value="debug"/>
<appender-ref ref="stdout"/>
</root>
</log4j:configuration>
Cela se produit probablement car votre configuration log4j est définie sur ERROR
. Recherchez un fichier log4j.properties avec un contenu similaire à celui-ci:
log4j.rootLogger=ERROR, CONSOLE
# console logging
log4j.appender.CONSOLE=org.Apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout=org.Apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %-20.20t %-24c{1}: %m%n
Le rootLogger
est défini sur le niveau ERROR
à l'aide d'un appender CONSOLE
.
Notez que certains appenders, comme l'appender console, ont également une propriété Threshold
qui peut être utilisée pour remplacer le niveau rootLoggers
. Vous devez vérifier les deux dans ce cas.
Si vous venez ici parce que vous utilisez Apache commons, journaliser avec log4j et que log4j ne fonctionne pas comme prévu, vérifiez que vous avez bien log4j.jar dans votre chemin d'accès aux classes au moment de l'exécution. Celui-là m'avait laissé perplexe pendant un petit moment. J'ai maintenant configuré le coureur dans mon environnement de développement pour inclure - Dlog4j.debug dans la ligne de commande Java) afin que je puisse toujours voir que Log4j est initialisé correctement.
Vous devez définir le niveau de consignateur au plus bas que vous souhaitez afficher. Par exemple, si vous souhaitez afficher les messages DEBUG, vous devez définir le niveau de journalisation sur DEBUG.
Le manuel d'Apache log4j comporte une section sur la configuration.
J'aime utiliser un appender de fichier en défilement pour écrire les informations de journalisation dans un fichier. Mon fichier de propriétés log4j ressemble généralement à ceci. Je préfère cette méthode, car j’aime effectuer une journalisation spécifique à un package au cas où j’ai besoin de divers degrés de journalisation pour différents packages. Un seul paquet est mentionné dans l'exemple.
log4j.appender.RCS=org.Apache.log4j.DailyRollingFileAppender
log4j.appender.RCS.File.DateFormat='.'yyyy-ww
#define output location
log4j.appender.RCS.File=C:temp/logs/MyService.log
#define the file layout
log4j.appender.RCS.layout=org.Apache.log4j.PatternLayout
log4j.appender.RCS.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm a} %5 %c{1}: Line#%L - %m%n
log4j.rootLogger=warn
#Define package specific logging
log4j.logger.MyService=debug, RCS
Cela est dû au fait que le niveau de consignation de votre enregistreur est défini sur "erreur". Par conséquent, vous ne verrez que les messages d'erreur ou supérieurs à ce niveau en termes de gravité. C'est pourquoi vous voyez également le message "irrécupérable".
Si vous définissez le niveau de journalisation sur 'debug' sur votre logger dans votre log4j.xml, tous les messages devraient s'afficher.
Jetez un coup d'œil à l'introduction log4j pour l'explication.