Фильтрация подкласса в log4j

У меня есть система, управляемая сообщениями, например, с классом 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

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

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


person Nulldevice    schedule 06.07.2011    source источник
comment
Как вы определяете Logger в коде? статический?   -  person Steve Brisk    schedule 06.07.2011
comment
Это третья балансовая единица. У меня только файлы .class.   -  person Nulldevice    schedule 06.07.2011


Ответы (2)


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

person Sampisa    schedule 06.07.2011

На самом деле это довольно просто.

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

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

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

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

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

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

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

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

person Aaron Digulla    schedule 06.07.2011
comment
Я считаю, что ключевым моментом здесь является удаление статики из объявления Logger в коде, но @Nulldevice работает со сторонним кодом. - person Steve Brisk; 06.07.2011
comment
Декомпилируйте его; вам просто нужно исправить одну строку. Просто убедитесь, что вы создали проект, который сможет построить даже идиот, чтобы применить исправление к новой версии. Если ничего не помогает, отфильтруйте статический флаг из байтового кода с помощью ASM или аналогичного инструмента. - person Aaron Digulla; 06.07.2011