Я хотел бы отфильтровать события журнала, поступающие от определенного компонента сторонней библиотеки, на основе содержимого сообщения журнала. Я хочу, чтобы эта фильтрация применялась только тогда, когда событие журнала генерируется определенным регистратором: "org.restlet.Component.LogService". Сама фильтрация - это просто базовое совпадение с сообщением о событии журнала.
У меня есть центральный AsyncAppender, который регистрирует несколько приложений. В случае, если события, поступающие из LogService, не отфильтрованы, я бы хотел, чтобы они обрабатывались так же, как сейчас, то есть отправляются AsyncAppender. Я не хочу добавлять фильтр в AsyncAppender, потому что это кажется ужасно неэффективным (мне не нужно фильтровать ВСЕ события, только те, которые поступают из регистратора LogService).
Итак, я попытался связать LogService logger с пользовательским Appender, который, в свою очередь, связан с пользовательским фильтром:
<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>
Ошибка, которую я сейчас получаю ...
log4j: ОШИБКА Для аппендера с именем [отфильтровано] не задан макет.
... говорит мне, что с моим дизайном что-то не так: я не думаю, что мой пользовательский аппендер должен заботиться о макете, так как на самом деле ему просто нужно передавать или не передавать событие журнала. Кроме того, для этого подхода требуются два пользовательских класса, и один из них (mystuff.FilteredAppender) вообще не добавляет значения - он предназначен только для хранения пользовательского фильтра.
Я бы хотел сделать что-нибудь более чистое, как ...
<logger name="org.restlet.Component.LogService">
<filter class="mystuff.EventFilter"/>
</logger>
... но это, очевидно, не поддерживается каркасом log4j.
Есть ли хороший чистый способ сделать фильтрацию событий так, как я хочу?