Frage

Ich mag Protokollereignisse filtern aus einer bestimmten Komponente einer 3rd-Party-Bibliothek kommen, basierend auf dem Inhalt der Log-Nachricht. Ich möchte nur diese Filterung angewandt werden, wenn das Protokoll Ereignis von einem bestimmten Logger erzeugt wird: „org.restlet.Component.LogService“. Die Filterung selbst ist nur ein einfaches Spiel gegen die Protokollereignismeldung.

Ich habe einen zentralen AsyncAppender, die auf mehr Appen protokolliert. Im Falle, dass Ereignisse aus LogService kommen, werden nicht ausgefiltert, würde Ich mag sie gleich behandelt werden, wie sie jetzt sind - das heißt, auf die AsyncAppender gesendete. Ich möchte nicht, einen Filter auf die AsyncAppender hinzuzufügen, weil diese schrecklich ineffizient scheint (ich brauche nicht auf alle Ereignisse zu filtern, nur die, die aus dem LogService Logger kommen).

Also, was ich versucht habe zu tun ist, Associate LogService Logger mit einem benutzerdefinierten Appender, der wiederum mit einem benutzerdefinierten Filter zugeordnet ist:

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

Der Fehler, den ich zur Zeit get ...

  

log4j. ERROR Kein Layout-Set für die appender dem Namen [gefiltert]

... sage ich, es ist etwas falsch mit meinem Design: Ich glaube nicht, meine Gewohnheit appender über das Layout kümmern sollte, da wirklich nur braucht es das Protokollereignis passiert oder nicht passieren entlang. Auch dieser Ansatz zwei benutzerdefinierte Klassen erfordert, und einer von ihnen (mystuff.FilteredAppender) überhaupt keinen Mehrwert -. Es ist nur dort die benutzerdefinierten Filter zu halten

Ich würde gerne etwas viel sauberer tun wie ...

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

... aber das ist offenbar nicht von dem log4j Rahmen unterstützt.

Gibt es eine gute, saubere Art und Weise Ereignisfilterung, wie ich es tun möchte, es zu tun?

War es hilfreich?

Lösung

Die message board Eintrag beschreibt eine Lösung, die ich arbeiten konnte bekommen. Es scheint eine Schande, hat einen AsyncAppender als Filterhalter zu verwenden, aber es sieht aus wie das ist die beste Option, w / o einen neuen benutzerdefinierten Appender zu schaffen. So habe ich am Ende oben mit:

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

Aber ich würde auf jeden Fall daran interessiert sein, wenn jemand einen noch besseren Ansatzes kennt. : -)

Andere Tipps

Log4J hat eine Extras Library ( JavaDoc) die LoggerMatchFilter bietet, auf Logger Namen zu filtern. Sie setzen den Namen Logger und ob zu akzeptieren oder abzulehnen (Standard ist zu akzeptieren).

Im decide Verfahren des Filters, vergleicht er den Logger Namen für die Gleichstellung der LoggingEvent object.getLoggerName(). Es ist ein überraschend einfach und offensichtlich Filter und ich bin ziemlich überrascht, dass es nicht mit Log4j standardmäßig kommt.

Alternativ, wenn Sie nur 3rd-Party-Bibliotheken beruhigen wollen, ich habe folgende als nützlich erwiesen:

<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top