59 votes

Comment configurer log4j pour que différents niveaux de journalisation soient enregistrés dans différents fichiers pour le même enregistreur ?

J'ai un journal normal de niveau INFO pour l'application. Ce dont j'ai besoin, c'est d'enregistrer en plus tous les événements de niveau ERROR dans un journal d'erreurs séparé. J'utilise la configuration suivante :

<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 place d'abord le logger de niveau info, il n'enregistrera que dans l'appender général, mais le logger d'erreur ne fonctionnera pas. J'aimerais que les deux fonctionnent.

83voto

skaffman Points 197885

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

<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 logger :

<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 au logger seront envoyées aux deux appenders, mais comme ils ont des seuils indépendants différents, l'appender ERROR_FILE n'enregistrera que les ERROR et au-dessus.

0 votes

@vilmonts Si vous définissez deux fois le même logger (com.acme), l'un d'eux est écrasé, et c'est pourquoi vous ne pouvez pas voir les messages INFO : le premier (avec le niveau "error") efface le suivant (avec les messages "info").

2 votes

Mais je veux permettre à mon appender ERROR_FILE de recevoir les messages de débogage sélectionnés d'un autre logger !

0 votes

Je pense alors que je dois écrire un filtre personnalisé. (Dans mon cas, j'ai trouvé une modification au niveau de l'application pour résoudre ce problème).

12voto

Tcaci Oleg Points 31

Solution de travail complète incluant la date dans le nom du 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>

0 votes

Il serait utile de connaître les dépendances.

6voto

Pawel Solarski Points 465

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.

0 votes

C'est une excellente réponse. J'utilise des fichiers .properties pour ma configuration de log4j. Pourriez-vous inclure dans votre réponse la manière de configurer ce filtre dans les fichiers .properties ?

0 votes

Ce n'est pas possible avec un fichier .properties, utilisez plutôt un fichier XML.

4voto

robothy Points 492

Si vous utilisez log4j2 et une configuration au format XML, Filtre à seuil est une bonne solution.

En 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-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="ERROR"/>
    </RollingFile>

    <RollingFile name="RollingInfoLogFile" 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="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>

2voto

borieux Points 21

En fait, vous pouvez le faire en utilisant le fichier .properties ; vous n'avez pas besoin d'utiliser le fichier .xml :

  • Enregistrer uniquement WARN

    log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter
    log4j.appender.appenderName.filter.a.LevelMin=WARN
    log4j.appender.appenderName.filter.a.LevelMax=WARN
  • Journal de bord de INFO à WARN

    log4j.appender.appenderName.filter.a=org.apache.log4j.varia.LevelRangeFilter
    log4j.appender.appenderName.filter.a.LevelMin=INFO
    log4j.appender.appenderName.filter.a.LevelMax=WARN

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