web-dev-qa-db-fra.com

Log4j: Pourquoi l'enregistreur racine collecte-t-il tous les types de journaux quelle que soit la configuration?

J'ai un problème que même si je spécifie le niveau à ERREUR dans la balise racine, l'appender spécifié enregistre tous les niveaux (débogage, info, avertir) dans le fichier quels que soient les paramètres. Je ne suis pas un expert log4j donc toute aide est appréciée.

Voici un peu plus d'informations sur le sujet:

  • J'ai vérifié le chemin de classe pour log4j.properties (il n'y en a pas) sauf le log4j.xml

voici le fichier log4j.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.Apache.org/log4j/'>


    <!-- ============================== -->
    <!-- Append messages to the console -->
    <!-- ============================== -->


    <appender name="console" class="org.Apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />

        <layout class="org.Apache.log4j.PatternLayout">
            <!-- The default pattern: Date Priority [Category] Message\n -->
            <param name="ConversionPattern" value="[AC - %5p] [%d{ISO8601}] [%t] [%c{1} - %L] %m%n" />
        </layout>
    </appender>

    <appender name="logfile" class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/server.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="2" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="payloadAppender" class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/payload.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="errorLog" class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/error.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="traceLog"
        class="org.Apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/trace.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="20" />

        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="[AccessControl - %-5p] {%t: %d{dd.MM.yyyy - HH.mm.ss,SSS}} %m%n" />
        </layout>
    </appender>

    <appender name="traceSocketAppender" class="org.Apache.log4j.net.SocketAppender">
        <param name="remoteHost" value="localhost" />
        <param name="port" value="4445" />
        <param name="locationInfo" value="true" />
    </appender>

    <logger name="TraceLogger">
        <level value="trace" /> <!-- Set level to trace to activate tracing -->
        <appender-ref ref="traceLog" />     
    </logger>

    <logger name="org.springframework.ws.server.endpoint.interceptor">
        <level value="DEBUG" />
        <appender-ref ref="payloadAppender" />
    </logger>

    <root>
        <level value="error" />
        <appender-ref ref="errorLog" />
    </root>

</log4j:configuration>

Si je remplace la racine par un autre enregistreur, alors rien n'est enregistré du tout dans l'appender spécifié.

<logger name="com.mydomain.logic">
    <level value="error" />
    <appender-ref ref="errorLog" />
</logger>

... et merci les gars pour les conseils à ce jour :-)

40
Petr Macek

L'enregistreur racine réside en haut de la hiérarchie des enregistreurs. Il est exceptionnel de trois manières:

  • ça existe toujours,
  • son niveau ne peut pas être défini sur null
  • il ne peut pas être récupéré par son nom.

Le rootLogger est le père de tous les ajouteurs. Chaque demande de journalisation activée pour un enregistreur donné sera transmise à tous les ajouteurs de cet enregistreur ainsi qu'aux ajouteurs supérieurs de la hiérarchie (y compris rootLogger)

Par exemple, si l'appendice console est ajouté à root logger, toutes les demandes de journalisation activées seront au moins imprimées sur la console. Si, en plus, un ajout de fichier est ajouté à un enregistreur, dites L, puis activez les demandes de journalisation pour L et L's les enfants imprimeront sur un fichier et sur le console. Il est possible de remplacer ce comportement par défaut afin que l'accumulation d'appendice ne soit plus additive en définissant l'indicateur d'additivité sur false.

Dans le manuel log4j

Pour résumer:

Si vous ne souhaitez pas propager un événement de journalisation aux enregistreurs parents (par exemple rootLogger), ajoutez l'indicateur d'additivité à false dans ces enregistreurs. Dans ton cas:

<logger name="org.springframework.ws.server.endpoint.interceptor"
        additivity="false">
        <level value="DEBUG" />
        <appender-ref ref="payloadAppender" />
</logger>

Dans le style de configuration standard de log4j (que je préfère au XML):

log4j.logger.org.springframework.ws.server.endpoint.interceptor = INFO, payloadAppender
log4j.additivity.org.springframework.ws.server.endpoint.interceptor = false

J'espère que cela t'aides.

74
monzonj

Exécutez votre programme avec -Dlog4j.debug pour que la sortie standard obtienne des informations sur la configuration de log4j - je soupçonne qu'il n'est pas configuré comme vous le pensez.

8

Pour ajouter à ce que James A.N.

-Dlog4j.debug est un moyen absolu de résoudre les problèmes de log4j.

6
matt b

Deux choses: vérifiez l'additivité et décidez si vous souhaitez que les événements de journal capturés par des niveaux de journalisation plus détaillés se propagent à l'enregistreur racine.

Deuxièmement, vérifiez le niveau de l'enregistreur racine. De plus, vous pouvez également ajouter un filtrage sur l'appendice lui-même, mais cela ne devrait normalement pas être nécessaire.

5
Asgeir S. Nilsen

Si vous utilisez un log4j.properties fichier, ce fichier est généralement censé être à la racine de votre chemin de classe, alors assurez-vous qu'il est là.

2
Michael

Il s'agit d'un comportement correct. L'enregistreur racine est comme le comportement par défaut. Donc, si vous ne spécifiez aucun enregistreur, le niveau d'enregistreur racine sera le niveau par défaut, mais cela ne signifie pas que le niveau d'enregistreur racine est le niveau de tous vos journaux.

N'importe quel code qui se connecte à l'aide de l'enregistreur "TraceLogger" ou "org.springframework.ws.server.endpoint.interceptor" enregistrera les messages en utilisant le niveau TRACE et DEBUG respectivement. dans votre cas ERREUR.

Donc, si vous utilisez un enregistreur autre que root, le niveau de journal racine sera remplacé par le niveau de journal de cet enregistreur. Pour obtenir la sortie souhaitée, changez les deux autres niveaux de journalisation en ERREUR.

J'espère que ceci est utile.

0
JCaptain