web-dev-qa-db-fra.com

Comment configurer log4j pour enregistrer différents niveaux de journal dans différents fichiers pour le même enregistreur

J'ai un journal de niveau INFO normal pour l'application. Ce dont j'ai besoin est de journaliser en plus tous les événements de niveau ERREUR pour séparer le journal des erreurs. J'utilise une configuration comme celle-ci:

<logger name="com.acme">
  <level value="error"/>
  <appender-ref ref="error"/>
</logger>

<logger name="com.acme">
  <level value="info"/>
</logger>

<root>
  <level value="warn"/>
  <appender-ref ref="general"/>
</root>

Cette configuration enregistre uniquement les erreurs. Si je mets d'abord l'enregistreur de niveau d'informations, il ne se connectera qu'à l'appendice général, mais l'enregistreur d'erreurs ne fonctionnera pas. J'aimerais qu'ils travaillent tous les deux.

53
vilmonts

Ce que vous devez faire, c'est avoir un seul <logger> définition avec un niveau défini d'INFO, mais dans vos deux définitions d'appendice, vous définissez leurs seuils en conséquence, par exemple.

<appender name="ERROR_FILE">
   <param name="Threshold" value="ERROR"/>
</appender>

<appender name="GENERAL">
   <param name="Threshold" value="INFO"/>
</appender>

Vous ajoutez ensuite les deux appenders à votre enregistreur:

<logger name="com.acme">
  <level value="INFO"/>
  <appender-ref ref="ERROR_FILE"/>
  <appender-ref ref="GENERAL"/>
</logger>

Les entrées de journal qui vont maintenant à l'enregistreur seront envoyées aux deux appender, mais comme elles ont des seuils indépendants différents, l'appender ERROR_FILE n'enregistrera que ERROR et plus.

71
skaffman

Solution de travail complète, y compris la date dans le nom de fichier:

<appender name="InfoFileAppender" class="org.Apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="FileNamePattern" value="/var/output/Info_%d{ddMMyyyy}.log" />
    </rollingPolicy>
    <layout class="org.Apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
    </layout>
    <filter class="org.Apache.log4j.varia.LevelRangeFilter">
      <param name="levelMin" value="INFO" />
      <param name="levelMax" value="INFO" />
    </filter>
</appender>

<appender name="ErrorFileAppender" class="org.Apache.log4j.rolling.RollingFileAppender">
    <param name="Threshold" value="ERROR" />
    <rollingPolicy class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="FileNamePattern" value="/var/output/Error_%d{ddMMyyyy}.log" />
    </rollingPolicy>
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
    </layout>
</appender>
<root>
    <level value="INFO" />
    <appender-ref ref="InfoFileAppender" />
    <appender-ref ref="ErrorFileAppender" />
</root>
10
Tcaci Oleg

Vous devez utiliser les filtres log4j:

<filter class="org.Apache.log4j.varia.LevelRangeFilter">
    <param name="levelMin" value="ERROR" />
    <param name="levelMax" value="ERROR" />
</filter>

De cette façon, vous pouvez créer des fichiers journaux pour chaque niveau séparément.

5
Pawel Solarski

Si vous utilisez log4j2 et config au format XML, ThresholdFilter est une bonne solution.

Voici un exemple:

    <?xml version="1.0" encoding="UTF-8"?>

      <Configuration status="WARN">

       <Appenders>
          <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <ThresholdFilter level="DEBUG"/>
    </Console>

    <RollingFile name="RollingDebugLogFile" fileName="logs/app-debug.log" filePattern="logs/$${date:yyyy-MM}/app-debug-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="20MB"/>
      </Policies>
      <ThresholdFilter level="DEBUG"/>
    </RollingFile>

    <RollingFile name="RollingErrorLogFile" fileName="logs/app-info.log" filePattern="logs/$${date:yyyy-MM}/app-info-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="20MB"/>
      </Policies>
      <ThresholdFilter level="ERROR"/>
    </RollingFile>

    <RollingFile name="RollingInfoLogFile" fileName="logs/app-error.log" filePattern="logs/$${date:yyyy-MM}/app-error-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %-5p  %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="20MB"/>
      </Policies>
      <ThresholdFilter level="INFO"/>
    </RollingFile>

  </Appenders>

  <Loggers>
    <Logger name="testLogger" level="DEBUG" additivity="false">
        <AppenderRef ref = "Console" />
        <AppenderRef ref="RollingErrorLogFile" />
        <AppenderRef ref="RollingInfoLogFile" />
        <AppenderRef ref="RollingDebugLogFile" />
    </Logger>
    <Root level="INFO">
      <AppenderRef ref = "Console" />
      <AppenderRef ref="RollingErrorLogFile" />
      <AppenderRef ref="RollingInfoLogFile" />
      <AppenderRef ref="RollingDebugLogFile" />
    </Root>

  </Loggers>
</Configuration>
4
robothy