web-dev-qa-db-fra.com

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

Existe-t-il un moyen de configurer log4j de sorte qu'il génère différents niveaux de journalisation vers différents appenders? 

J'essaie de configurer plusieurs fichiers journaux. Le fichier journal principal contiendrait tous les messages INFO et supérieurs pour toutes les classes. (En développement, tous les messages DEBUG et au-dessus seront capturés, ainsi que TRACE pour des classes spécifiques.) 

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

Y at-il un moyen d'obtenir ce que je suis après?

Merci, Dan

81
Daniel

Cela devrait vous aider à démarrer:

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
70
jasonnerothin

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; par contre, foo.log contient uniquement des messages com.example.foo, y compris des messages de niveau débogage.

26
araqnid

J'avais cette question, mais avec une torsion - j'essayais de connecter un contenu différent à différents fichiers. J'avais des informations pour un journal de débogage LowLevel et un journal d'utilisateur HighLevel. Je voulais que LowLevel ne contienne qu'un seul fichier et que HighLevel contienne à la fois un fichier et un syslogd.

Ma solution consistait à configurer les 3 annexes, puis à configurer la journalisation comme suit:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

La partie qui était difficile pour moi à comprendre était que le "log4j.logger" pouvait avoir plusieurs appenders énumérés. J'essayais de le faire ligne par ligne.

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

7
Kieveli

Pour le fichier journal/appender principal, configurez un .Threshold = INFO afin de limiter les informations réellement consignées dans l'appender, à INFO et aux versions ultérieures, que les enregistreurs aient ou non activé DEBUG, TRACE, etc.

Pour attraper DEBUG et rien d’autre, vous devrez probablement écrire un appender personnalisé.

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

  1. Si votre objectif est d'avoir un seul fichier où vous pouvez résoudre un problème, il sera ennuyeux d'étendre vos données de journal sur différents fichiers. À moins que vous n'ayez une politique de journalisation très stricte, vous aurez probablement besoin de contenu de DEBUG et d'INFO pour: être capable de tracer efficacement l'exécution du code problématique.
  2. En enregistrant tout de même tous vos messages de débogage, vous perdez les gains de performances que vous obtenez habituellement dans un système de production en refusant la journalisation.
3
matt b

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

Ma solution est basée sur la configuration XML à l'aide de spring-boot-starter-log4j. Cet exemple est un exemple de base utilisant spring-boot-starter et les deux enregistreurs écrivent dans des fichiers journaux différents. 

0
Rzv Razvan