Учебное пособие по Logstash: использование Logstash для оптимизации уведомлений по электронной почте
Опубликовано: 2022-03-11Приложения, использующие электронную почту в качестве основного механизма сообщения об ошибках и исключениях, поначалу всегда кажутся хорошей идеей. Как разработчики Java, мы думаем: «Эй, я сразу узнаю, когда что-то пойдет не так!»
Однако в какой-то момент вы обязательно поймете, что электронные письма об ошибках уходят от вас, и вам нужно очистить свой почтовый ящик. Вы можете игнорировать 404 (большую часть времени), и может быть приятно получать уведомления о новых регистрациях, но в конце дня это может стать слишком беспокойным или трудоемким.
Рано или поздно отличить «действующие» электронные письма от бессмысленных уведомлений становится сложно. Вы можете настроить правила и фильтры для своей почты, но даже они могут стать неуправляемыми.
В этом учебном пособии по Java будет рассмотрена возможность использования Logstash для восстановления контроля и очистки почтового ящика, а также для того, чтобы ваши сообщения об ошибках снова стали управляемыми, и все это без каких-либо изменений в вашем приложении.
Настройка и ввод Logstash
Первый шаг в нашем руководстве по Logstash — убедиться, что вся электронная почта, которую вы получаете из своей системы, направляется в одну папку. Поскольку мы переносим всю сортировку и управление из вашего почтового ящика, теперь не будет иметь значения, что это одна большая папка. Идите вперед и удалите все папки и фильтры, которые вы уже настроили, и сократите их до одной папки и одного фильтра.
Переместите всю электронную почту из «[email protected]» в папку «MyAwesomeAppEmails». Если у вас есть отдельный почтовый ящик для этих писем, то будет еще проще.
Теперь мы можем настроить Logstash для опроса этой папки и анализа почты с помощью плагина IMAP. Версия 1.4.2 поддерживает только извлечение электронных писем из папки «Входящие», но в версии 1.5 было применено относительно простое исправление, позволяющее опрашивать определенную папку. Если у вас нет отдельного почтового ящика, примените исправление к подключаемому модулю IMAP в своем экземпляре Logstash, прежде чем продолжить.
# /etc/logstash/conf.d/01-imap-input.conf input { imap { host => "imap.yourmailserver.com" user => "username" password => "password" secure => true fetch_count => 15 folder => "MyAwesomeAppEmails" # This line will only work if you apply the above mentioned patch } }
Это начнет проверять новые электронные письма и анализировать их в событиях Logstash.
Логсташ Фильтр
Многие полезные данные анализируются из электронных писем в различные свойства событий — обратите внимание, что временная метка электронной почты используется как «@timestamp» для события. Более того, из одних только заголовков мы можем делать такие вещи, как определение хоста, с которого возникла ошибка:
filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }
Однако этого недостаточно, чтобы укротить сообщения об ошибках. Нам нужно немного больше, в частности, следующие три шага, описывающие:
- Тип ошибки
- Серьезность ошибки
- Любые сведения об ошибке, включенные в электронное письмо
Предположим, вы указали название ошибки, например, «Ошибка виджета», а также серьезность ошибки «ОШИБКА» в теме письма следующим образом: «ОШИБКА: Ошибка виджета в /var/www/myapp/foobar .php 20”.

Мы будем использовать это, чтобы установить несколько свойств события:
filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }
Logstash поставляется с рядом предопределенных шаблонов, которые вы можете увидеть в журналах и других местах. Используйте их, чтобы создать шаблоны Grok и сделать их более удобными для чтения. Мы использовали «WORD» (одно слово), «DATA» (не жадный набор), «PATH» (путь к файлу Unix или Windows) и «POSINT» (положительное целое число). Вы также можете использовать Grok Debugger для отладки шаблонов Grok. Сообщения, не соответствующие шаблону, будут помечены тегом «_grokparsefailure».
Это касается типа, серьезности, исходного файла и строки ошибки — в основном всех соответствующих метаданных события. Теперь о деталях.
Тонкая настройка Logstash
Возможно, раньше вы добавляли красивую подпись в шапке или футере к своему электронному письму, будучи вежливым человеком, которым вы являетесь, но теперь это мешает. Давайте удалим его из сообщения, а также все завершающие пробелы, чтобы мы могли проанализировать остальную часть письма на предмет трассировки стека ошибки:
filter { mutate { # gsub takes 3 elements per substitution: field, regular expression and substitution gsub => [ "message", "Your Dev Team", "", "message", "More error details:", "" ] } mutate { strip => "message" } # Split the message into an array of lines, each containing a line of the stacktrace mutate { split => [ "message", "\n" ] } }
Мутация «gsub» использует стандартный объект Ruby Regexp, поэтому все параметры и функции также доступны в logstash.
Вывод через Elasticsearch и Amazon SNS
Давайте применим это к нашему экземпляру Elasticsearch, используя выходные данные Logstash Elasticsearch, чтобы мы могли легко искать и количественно оценивать данные, которые мы собираем:
output { if "_grokparsefailure" not in [tags] { elasticsearch { } } }
Мы исключаем все сообщения, которые неправильно обработаны Grok, проверяя наличие тега «_grokparsefailure». Предполагается, что только сообщения электронной почты, тема которых соответствует указанной теме, должны интерпретироваться как сообщения об ошибках. В остальном все просто и понятно.
Logstash поставляется с множеством выходных данных, поэтому давайте улучшим его еще больше, используя выходные данные SNS, чтобы уведомлять нас о значительных ошибках с помощью службы Amazon Simple Notification Service (SNS). Предположим, что все ошибки типа «уведомляемые» должны генерировать уведомление. Если вы не используете инстанс EC2, вам потребуется указать ключ и секрет AWS.
output { if "notifiable" in [tags] { sns { region => "us-east-1" arn => "arn:aws:sns:us-east-1:1234567890123456:mytopic" access_key_id => "AWS ACCESS_KEY" # Only specify these if you're not on an EC2 instance secret_access_key => "AWS ACCESS SECRET" # Only specify these if you're not on an EC2 instance } } }
Пометка ошибок как «уведомляемых» зависит от вас. Вы можете сделать это, взглянув либо на серьезность ошибки, либо на тип ошибки.
Теперь вы снова можете читать важные электронные письма и можете быть уверены, что не пропустите важные электронные письма об ошибках. Вы также можете принимать обоснованные решения о том, какие ошибки исправлять, так как вы можете видеть, как часто возникает ошибка и когда она произошла в последний раз. Поиск конкретной ошибки также стал проще и быстрее благодаря потрясающим поисковым возможностям Elasticsearch, описанным в этом руководстве по Logstash.