Question

Je souhaite filtrer les événements de journal provenant d'un composant spécifique d'une bibliothèque tierce, en fonction du contenu du message de journal. Je souhaite uniquement que ce filtrage soit appliqué lorsque l'événement de journalisation est généré par un consignateur spécifique: "org.restlet.Component.LogService". Le filtrage lui-même est juste une correspondance de base avec le message d’événement de journal.

J'ai un AsyncAppender central qui se connecte à plusieurs ajouts. Si les événements provenant de LogService ne sont pas filtrés, j'aimerais qu'ils soient traités de la même manière qu'ils le sont maintenant, c'est-à-dire qu'ils sont envoyés à AsyncAppender. Je ne souhaite pas ajouter de filtre à AsyncAppender, car cela semble terriblement inefficace (je n'ai pas besoin de filtrer TOUS les événements, mais uniquement ceux provenant du consignateur LogService).

Donc, ce que j'ai essayé de faire est d'associer le consignateur LogService à un Appender personnalisé, qui est associé à un filtre personnalisé:

    <appender name="filtered" class="mystuff.FilteredAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService">
            <appender-ref ref="filtered"/>
    </logger>

L'erreur que je reçois actuellement ...

  

log4j: ERROR Aucune disposition définie pour l'appendeur nommé [filtré].

... me dit qu'il y a quelque chose qui cloche dans ma conception: je ne pense pas que mon appender personnalisé devrait se soucier de la mise en page, car en réalité, il doit simplement transmettre ou non l'événement du journal. De plus, cette approche nécessite deux classes personnalisées, et l’une d’entre elles (mystuff.FilteredAppender) n’ajoute aucune valeur - elle n’est là que pour contenir le filtre personnalisé.

J'aimerais faire quelque chose de beaucoup plus propre, comme ...

    <logger name="org.restlet.Component.LogService">
            <filter class="mystuff.EventFilter"/>
    </logger>

... mais ceci n'est apparemment pas supporté par le framework log4j.

Existe-t-il un moyen propre de filtrer les événements comme je le souhaite?

Était-ce utile?

La solution

Cette entrée sur le tableau de messages décrit une solution que j'ai pu travailler. Il semble dommage de devoir utiliser un AsyncAppender comme porte-filtre, mais il semble que ce soit la meilleure option sans créer un nouvel Appender personnalisé. Je me retrouve donc avec:

    <appender name="filtered" class="org.apache.log4j.AsyncAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService" additivity="false">
            <appender-ref ref="filtered"/>
    </logger>

Mais je serais certainement intéressé si quelqu'un connaissait une approche encore meilleure. : -)

Autres conseils

Log4J a une Bibliothèque d'Extras ( JavaDoc) qui fournit LoggerMatchFilter , permettant de filtrer les noms des enregistreurs. Vous définissez le nom de l’enregistreur et indiquez si vous souhaitez l’accepter ou le refuser (l’acceptation par défaut est acceptée).

Dans la méthode decide du filtre, le nom du journal est comparé à LoggingEvent object.getLoggerName () pour égalité. C'est un filtre étonnamment simple et évident et je suis assez surpris qu'il ne vienne pas par défaut avec Log4j.

Par ailleurs, si vous souhaitez uniquement calmer les bibliothèques tierces, les éléments suivants vous sont utiles:

<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top