81 votes

Création de plusieurs fichiers journaux de contenu différent avec log4j

Existe-t-il un moyen de configurer log4j de manière à ce qu'il envoie différents niveaux de journalisation à différents appenders ?

J'essaie de mettre en place plusieurs fichiers journaux. Le fichier journal principal reprendrait tous les messages INFO et supérieurs pour toutes les classes. (En développement, il reprendrait tous les messages DEBUG et supérieurs, et TRACE pour les classes spécifiques).

Ensuite, j'aimerais avoir un fichier journal séparé. Ce fichier journal recueillerait tous les messages DEBUG pour un sous-ensemble spécifique de classes, et ignorerait tous les messages pour toute autre classe.

Y a-t-il un moyen d'obtenir ce que je cherche ?

Merci, Dan

3 votes

Voulez-vous dire que vous voulez qu'un fichier journal capture DEBUG et uniquement DEBUG, un autre fichier journal capture INFO et uniquement INFO, et ainsi de suite ?

71voto

jasonnerothin Points 1001

Cela devrait vous permettre de commencer :

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...

# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

4 votes

Que fait la toute dernière ligne ?

1 votes

@djangofan configure un niveau de journalisation personnalisé pour le paquet/la classe (par exemple com.yourpackage.yourclazz avec la journalisation TRACE), bien que dans ce cas, il était déjà par défaut (configuré à la ligne 1), donc il ne fait rien. IMO cet exemple serait meilleur si le rootLogger avait INFO et "yourclass" avait DEBUG.

1 votes

Les paramètres de la première ligne devraient être TRACE, QuietAppender, LoudAppender et non QuietAppender, LoudAppender, TRACE.

26voto

araqnid Points 33350

Peut-être quelque chose comme ça ?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

Ainsi, tous les messages d'information sont écrits dans server.log ; en revanche, foo.log ne contient que les messages de com.example.foo, y compris les messages de niveau débogage.

0 votes

Est-ce que com.example.foo est un paquet ou une classe ?

1 votes

@WowBow ça pourrait être l'un ou l'autre, mais avec un nom comme ça, ça ressemble à un paquet. Utiliser des noms de classe pour les loggers est juste une convention.

0 votes

Merci. J'ai essayé les deux après avoir demandé et ça marche pour les deux ;)

7voto

Kieveli Points 7162

Je me posais la même question, mais avec une particularité : j'essayais d'enregistrer différents contenus dans différents fichiers. J'avais des informations pour un journal de débogage de bas niveau et un journal d'utilisateur de haut niveau. Je voulais que le journal de débogage de bas niveau ne soit envoyé qu'à un seul fichier, et que le journal de haut niveau soit envoyé à la fois à un fichier et à syslogd.

Ma solution a été de configurer les 3 appenders, puis de configurer la journalisation comme ceci :

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

Ce que j'ai eu du mal à comprendre, c'est que le fichier "log4j.logger" pouvait contenir plusieurs appenders. J'essayais de le faire une ligne à la fois.

J'espère que cela aidera quelqu'un à un moment donné !

3voto

matt b Points 73770

Pour le fichier journal/appendice principal, créez un fichier .Threshold = INFO pour limiter ce qui est réellement consigné dans l'appender à INFO et au-dessus, que les enregistreurs aient ou non activé DEBUG, TRACE, etc.

Pour ce qui est d'attraper DEBUG et rien au-dessus de cela... vous devrez probablement écrire un appender personnalisé.

Cependant, je vous recommande de ne pas le faire, car il semble que cela rende le dépannage et l'analyse assez difficiles :

  1. Si votre objectif est de disposer d'un fichier unique dans lequel vous pouvez chercher à résoudre un problème, la répartition de vos données de journalisation entre différents fichiers sera gênante - à moins que vous n'ayez une politique de journalisation très stricte, vous aurez probablement besoin du contenu des fichiers DEBUG et INFO pour pouvoir retracer efficacement l'exécution du code problématique.
  2. En continuant à consigner tous les messages de débogage, vous perdez les gains de performance que vous obtenez habituellement dans un système de production en réduisant (considérablement) la consignation.

0 votes

J'aurais dû mieux expliquer mon objectif. Le journal principal sert à repérer les erreurs, les conditions inhabituelles, etc. à n'importe quel endroit de l'application - ce journal doit rester petit, il est donc régulièrement mis à jour. Le journal spécial suit le comportement d'un sous-système, et doit être conservé pendant de longues périodes.

0 votes

Voulez-vous exclure les messages ERROR, WARN, INFO du second fichier journal ?

0 votes

Et dans le XML vous pouvez ajouter le paramètre Threshold comme ceci : <appender name="ERROR_FILE"> <param name="Threshold" value="ERROR"/> </appender>

0voto

Rzv Razvan Points 368

Lien de démonstration : https://github.com/RazvanSebastian/spring_multiple_log_files_demo.git

Ma solution est basée sur une configuration XML utilisant spring-boot-starter-log4j . L'exemple est un exemple de base utilisant spring-boot-starter et les deux loggers écrivent dans des fichiers journaux différents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X