Статьи

Log4j, Stat4j, SMTPAppender Integration – Объединение журналов ошибок для отправки электронной почты, когда слишком много

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

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

Соревнование

Мы столкнулись со следующими проблемами с журналами:

  • К сожалению, нормально иметь определенное количество исключений (клиенты выбирают критерии поиска, не дающие результатов, временные, неважные отключения внешних служб и т. Д.), И мы, конечно, не хотим, чтобы из-за этого спам. Таким образом, решение должно иметь настраиваемое пороговое значение и отправлять предупреждение только при его превышении.
  • Частота отказов должна рассчитываться в течение настраиваемого периода (достаточно продолжительного, чтобы не вызывать оповещение из-за перерывов в несколько минут, но достаточно короткого, чтобы группа могла быть проинформирована как можно скорее, когда происходит что-то серьезное).
  • После того, как оповещение отправлено, дальнейшие оповещения не должны отправляться снова в течение некоторого времени (в идеале, пока исходная проблема не будет устранена), мы не хотим получать спам из-за проблемы, о которой мы уже знаем.

Решение

Мы основали наше решение на Stat4J Лары Д’Абрео, который предоставляет пользовательское приложение Log4J, которое использует журналы для вычисления настраиваемых мер и запускает оповещения, когда они превышают свои предупреждения или критические пороговые значения. Ей уже пару лет, библиотека с открытым исходным кодом альфа-качества (в отношении ее универсальности и гибкости), которая, к счастью, достаточно проста, чтобы ее можно было легко модифицировать для своих нужд.

Таким образом, мы настроили Stat4J для выдачи предупреждений, когда количество предупреждений превышает пороговые значения, и после этого сохраняем молчание и объединяем их с SMTPAppender Log4J, который прослушивает предупреждения и отправляет их по электронной почте команде.

Stat4J Tweaking

Ключевыми компонентами Stat4J являются Stat4jAppender for Log4J, калькуляторы (меры), которые агрегируют отдельные журналы (например, путем их подсчета или извлечения некоторого числа из них), статистика, которая определяет, какие журналы следует рассматривать с помощью регулярных выражений и как обрабатывать их с помощью ссылка на калькулятор и, наконец, оповещения, в которых регистрируется предупреждение, когда значение статистики превышает его пределы. Вы можете узнать больше в статье, которая представляет Stat4J .

Мы реализовали калькулятор пользовательских мер RunningRate (для подсчета количества сбоев за последние N минут) и изменили Stat4J следующим образом:

  • Мы усовершенствовали Alert для поддержки нового атрибута quietperiod, так что после запуска последующие предупреждения будут игнорироваться в течение этого периода (если только предыдущее предупреждение не было просто предупреждением, а новое является критическим)
  • Мы изменили приложение , добавив в него Throwable журнала вместе с сообщением журнала, которое затем передается в отдельные калькуляторы статистики, чтобы мы могли более точно фильтровать то, что мы хотим считать
  • Наконец, мы изменили Alert для регистрации предупреждений как ошибок вместо предупреждений, чтобы SMTPAppender не игнорировал их

Получите наш модифицированный Stat4j от GitHub (исходники или скомпилированный jar ). Отказ от ответственности: это один день взломать, и я не горжусь кодом.

Конфигурация Stat4J

Возьмите пример stat4j.properties и поместите его в путь к классам. Уже настроен правильный калькулятор, статистика и оповещение. Смотрите эту часть:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
### JAKUB HOLY - MY CONFIG
calculator.minuteRate.classname=net.sourceforge.stat4j.calculators.RunningRate
# Period is in [ms] 1000 * 60 * 10 = 10 min:
calculator.minuteRate.period=600000
 
statistic.RunningErrorRate.description=Errors per 10 minutes
statistic.RunningErrorRate.calculator=minuteRate
# Regular expression to match "<throwable.toString> <- <original log message>"
statistic.RunningErrorRate.first.match=.*Exception.*
 
# Error Rate
alert.TooManyErrorsRecently.description=Too many errors in the log
alert.TooManyErrorsRecently.statistic=RunningErrorRate
alert.TooManyErrorsRecently.warn= >=3
alert.TooManyErrorsRecently.critical= >=10
alert.TooManyErrorsRecently.category=alerts
# Ignore following warnings (or criticals, after the first critical) for the given amount of time:
# 1000 * 60 * 100 = 100 min
alert.TooManyErrorsRecently.quietperiod=6000000

Важные параметры конфигурации

  • calculator.minuteRate.period (в мс) — подсчет ошибок за этот период, сброс счетчика в конце; разумное значение может быть 10 минут
  • alert.TooManyErrorsRecently.warn и alert.TooManyErrorsRecently.critical — активировать оповещение, если за период было обнаружено столько ошибок; разумные значения зависят от нормальной частоты ошибок вашего приложения
  • alert.TooManyErrorsRecently.quietperiod (в мс) — не отправлять дополнительные оповещения за этот период, чтобы не спамить в ситуации постоянного сбоя; разумное значение зависит от того, как быстро вы обычно решаете проблемы, мне кажется, что 1 час в порядке

Конфигурация Log4J

Теперь нам нужно указать Log4J использовать приложение Stat4j для подсчета случаев возникновения ошибок и отправки оповещений по электронной почте:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
log4j.rootCategory=DEBUG, Console, FileAppender, Stat4jAppender
...
### Stat4jAppender & EmailAlertsAppender ###
# Collects statistics about logs and sends alerts when there
# were too many failures in cooperation with the EmailAlertsAppender
 
## Stat4jAppender
log4j.appender.Stat4jAppender=net.sourceforge.stat4j.log4j.Stat4jAppender
log4j.appender.Stat4jAppender.Threshold=ERROR
# For configuration see stat4j.properties
 
## EmailAlertsAppender
# BEWARE: SMTPAppender ignores its Thresholds and only evers sends ERROR or higher messages
log4j.category.alerts=ERROR, EmailAlertsAppender
log4j.appender.EmailAlertsAppender=org.apache.log4j.net.SMTPAppender
log4j.appender.EmailAlertsAppender.To=dummy@example.com
# BEWARE: The address below must have a valid domain or some receivers will reject it (e.g. GMail)
log4j.appender.EmailAlertsAppender.From=noreply-stat4j@google.no
log4j.appender.EmailAlertsAppender.SMTPHost=172.20.20.70
log4j.appender.EmailAlertsAppender.BufferSize=1
log4j.appender.EmailAlertsAppender.Subject=[Stat4j] Too many exceptions in log
log4j.appender.EmailAlertsAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.EmailAlertsAppender.layout.ConversionPattern=%d{ISO8601} %-5p %X{clientIdentifier} %c %x - %m%n

Комментарии

  • # 8 Укажите аппендер Stat4J
  • # 9 Отправляйте только ОШИБКИ на Stat4J, нас не интересуют менее серьезные исключения
  • # 14 «оповещения» — это категория журнала, используемая Stat4jAppender для регистрации оповещений (то же самое, что вы создали бы с помощью Logger.getLogger («оповещения»)); как уже упоминалось, SMTPAppender будет без учета конфигурации обрабатывать только ОШИБКИ и выше

Проблемы с SMTPAppender

Довольно сложно заставить работать SMTPAppender. Некоторые подводные камни:

  • SMTPAppender игнорирует все журналы, которые не имеют ОШИБКУ или выше, независимо от того, как вы установили его порог
  • Если вы укажете несуществующий домен From, почтовые серверы некоторых получателей могут просто удалить сообщение как спам (например, GMail).
  • Чтобы отправлять электронные письма, вам, конечно, нужен mail.jar (а для более старых JVM также Activ.jar), здесь приведены инструкции для Tomcat.

И один совет за 100 $: чтобы отладить его, запустите ваше приложение в режиме отладки и установите точку останова метода на javax.mail.Transport # send (вам не нужен исходный код), а когда есть, установите this.session.debug для Значение true, чтобы получить очень подробный журнал следующих SMTP-сообщений в журнале сервера.

Примечание

Тот факт, что эта статья основана на Log4J, не означает, что я лично выберу ее, она просто пришла с проектом. Я бы по крайней мере решил использовать более новый и блестящий Logback вместо этого :-).

Вывод

Stat4j + SMTPAppender — очень хорошая база для довольно гибкой системы оповещения «сделай сам», основанной на журналах и электронной почте. Вы можете достичь того же самого из коробки с Hyperic HQ plus.

Ссылка: агрегирование журналов ошибок для отправки предупреждений по электронной почте, когда их слишком много — Log4j, Stat4j, SMTPAppender от нашего партнера по JCG Якуба Холи из блога «Святая Ява» .

Статьи по Теме :