Вопрос

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

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

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

  1. Существует ли что-то подобное уже?

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

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

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

Это было полезно?

Решение

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

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

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

HTH,

Другие советы

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

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

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

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

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

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

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

  1. Используйте пользовательский JDBCAppender.В отличие от того, что поставляется в комплекте с Log4j, этот может регистрировать исключения.
  2. Настройте встроенную базу данных, например HSQLDB, и настройте базу данных с одной таблицей для ведения журнала событий.Это решает проблему сохранения, так как вы можете использовать SQL для поиска типов произошедших событий.
  3. Запустите отдельный поток, который отслеживает базу данных и обнаруживает нужные шаблоны событий.
  4. Используйте Менеджер журнала для доступа к желаемому Регистраторs и установите их уровень вручную.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top