Log4J перенаправление событий журнала - PullRequest
2 голосов
/ 30 июля 2009

Я хотел бы создать Appender (или что-то подобное), который проверяет события и при определенных условиях создает в журналах новые события.

В качестве примера можно привести Escalating Appender, который проверяет, зарегистрировано ли определенное количество идентичных событий и, если это так, регистрирует событие с более высоким лог-логом. Таким образом, вы можете определить что-то вроде: Если вы получите более 10 одинаковых предупреждений для этого регистратора, сделайте это ошибкой.

Итак, мои вопросы:

  1. Что-то подобное уже существует?

  2. Является ли Appender подходящим классом для реализации этого поведения?

  3. Есть ли какие-нибудь ловушки, о которых вы могли подумать?

Разъяснение: Я в порядке с алгоритмом сбора и анализа событий. Я сделаю это с коллекцией внутри appender. Стойкость не нужна для моей цели. Мой вопрос № 2: является ли аппендиат подходящим местом для этого? В конце концов, это ненормальное поведение для создания записей журнала для appender.

Ответы [ 3 ]

2 голосов
/ 30 июля 2009

Вы можете создать свой собственный appender, реализовав интерфейс Appender, предоставляемый log4j.

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html

Это был бы один подход. Другой вариант - использовать существующий appender, а затем написать код, который отслеживает журнал. Например, вы можете войти в базу данных, а затем написать процесс, который отслеживает записи журнала в базе данных и создает мета-события на основе того, что он видит.

Это зависит больше всего от того, что вам удобно. Один вопрос, с которым вам придется столкнуться, это как посмотреть в журнале, чтобы создать ваши мета-события. Либо вам придется накапливать события в вашем приложении, либо сохранять их где-то, к чему вы можете обратиться для создания своих мета-событий. Проблема с их накоплением заключается в том, что если вы остановите и начнете свой процесс, вам придется либо сбрасывать их куда-нибудь, чтобы они возвращались, либо запускаться заново при каждом перезапуске процесса.

Например, допустим, я хочу создавать запись журнала каждый 10-й раз, когда выдается NullPointerException. Если у меня есть какие-либо записи в базе данных, каждый раз, когда создается NPE, я запускаю запрос, чтобы посмотреть, сколько NPE было сгенерировано с тех пор, как я в последний раз создавал для них запись журнала. Если я просто подсчитываю их в памяти каждый раз, когда один из них выбрасывается, если я перезапускаю приложение после того, как выброшено 5, если я не сохраню это число, я потеряю счет.

1 голос
/ 31 июля 2009

Logback (преемник log4j) позволит вам включить ведение журнала для любого события через TurboFilters . Например, предполагая, что одно и то же событие происходит N или более раз за определенный период времени, вы можете принудительно принять событие (независимо от его уровня). См. Также DuplicateMessageFilter , который выполняет обратное (отрицание повторяющихся событий).

Однако даже logback не позволит увеличить уровень события регистрации. Log4j тоже не будет. Ни одна из этих платформ не предназначена для этого, и я не рекомендую вам пытаться увеличить уровень на лету и в пределах одной и той же цепочки. С другой стороны, увеличение уровня во время постобработки - это совсем другое дело. Сигнализация другого потока для генерации нового события регистрации с более высоким уровнем является дополнительной возможностью. (Пусть ваш турбофильтр подаст сигнал другому потоку для создания нового события регистрации с более высоким уровнем.)

Из вашего вопроса не было понятно, почему вы хотели повысить уровень. Был ли прирост уровня причиной сам по себе или средством достижения цели, когда событие регистрируется независимо от его уровня. Если последнее, то TurboFilters logback - это путь.

НТН,

0 голосов
/ 31 июля 2009

Как уже говорил Рэйф, самой сложной задачей будет сохранение фактических событий в Appender, чтобы вы знали, что пришло время инициировать ваше событие (например, повысить уровень журнала).

Поэтому я предлагаю следующую стратегию:

  1. Используйте пользовательский JDBCAppender . В отличие от того, что входит в комплект Log4j, он может регистрировать исключения.
  2. Настройте встроенную базу данных, например HSQLDB , и настройте базу данных с одной таблицей для регистрации событий. Это решает проблему постоянства, так как вы можете использовать SQL для поиска типов событий, которые произошли.
  3. Запуск отдельного потока, который отслеживает базу данных и обнаруживает нужные шаблоны событий.
  4. Используйте LogManager для доступа к нужным Logger s и установите их уровень вручную.
...