Фильтрация подкласса в log4j - PullRequest
0 голосов
/ 06 июля 2011

У меня есть система, управляемая сообщениями, например, с классом com.example.BaseMessagingAgent, который является базовым классом для многих агентов сообщений. Этот базовый класс регистрирует события сообщений. Существует много подклассов этого базового класса, реализующих разные специфические агенты системы. Давайте рассмотрим com.example.MyAgent, который расширяет com.example.BaseMessagingAgent.

Я хочу регистрировать сообщения, относящиеся только к классу MyAgent. Но я не могу определить ведение журнала как:

log4j.logger.com.example.MyAgent=DEBUG, APPENDER

, поскольку ведение журнала происходит в родительском классе com.example.BasicMessagingAgent - я ничего не буду записывать.

И я тоже не хочу устанавливать логирование в базовом классе:

log4j.logger.com.example.BaseMessagingAgent=DEBUG, APPENDER

потому что он будет регистрировать события для всех агентов, и у меня будет много ненужных журналов.

Кто-нибудь знает, как ограничить ведение журнала только одним подклассом?

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Вы должны написать фильтр для Log4j, так как AFAIK нет способа поместить такую ​​информацию в файл log4j.properties. Больше информации на http://books.google.it/books?id=vHvY008Zq-YC&lpg=PA95&ots=yi335bZU7z&dq=&pg=PA95#v=onepage&q&f=false

0 голосов
/ 06 июля 2011

Это довольно просто, на самом деле.

Сначала добавьте appender в корневой логгер.В самом деле.Это сделает вашу жизнь намного проще.

Теперь настройте все это:

log4j.rootLogger=DEBUG, APPENDER
log4j.logger.com=ERROR
log4j.logger.com.example.MyAgent=DEBUG

По умолчанию для всех классов ниже «com. *» Будет регистрироваться только ошибки.Единственное исключение - com.example.MyAgent, которое будет регистрировать на уровне отладки.

Вам также необходимо установить для корневого регистратора значение DEBUG, иначе оно отбросит все сообщения журнала отладки.

Следующим шагом является использование одного регистратора для каждого экземпляра.Чтобы получить это, просто удалите static в строке, в которой вы создаете свой регистратор, и замените BaseMessagingAgent на getClass()

Я знаю, это выглядит как перебор, но вот как работает log4j.Кроме того, создание регистратора для каждого экземпляра не очень дорого (если вы не создадите миллионы MyAgent в секунду).

Если вы действительно хотите добавить аппендер в один класс, не забудьте включитьОтключение аддитивности (...Class.additivity=false) или вы получите все сообщения журнала дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...