Logstash-Tutorial: Verwenden von Logstash zum Optimieren von E-Mail-Benachrichtigungen
Veröffentlicht: 2022-03-11Apps, die E-Mails als Hauptmechanismus zum Melden von Fehlern und Ausnahmen verwenden, scheinen zunächst immer eine gute Idee zu sein. Als Java-Entwickler denken wir: „Hey, ich weiß sofort, wenn etwas schief geht!“
Irgendwann werden Sie jedoch feststellen, dass die Fehler-E-Mails an Ihnen vorbeiziehen und Sie Ihr E-Mail-Postfach aufräumen müssen. Sie können 404-Fehler (meistens) ignorieren, und es kann schön sein, Benachrichtigungen über neue Anmeldungen zu erhalten, aber am Ende des Tages kann es etwas zu hektisch oder zeitaufwändig werden.
Früher oder später wird es schwierig, „umsetzbare“ E-Mails von sinnlosen Benachrichtigungen zu unterscheiden. Sie können Regeln und Filter für Ihre E-Mails einrichten, aber selbst diese können unüberschaubar werden.
Dieses Java-Tutorial befasst sich mit der Möglichkeit, mit Logstash die Kontrolle zurückzugewinnen und Ihren E-Mail-Posteingang aufzuräumen und Ihre Fehler-E-Mails wieder überschaubar zu machen, ohne auch nur eine einzige Sache in Ihrer App zu ändern.
Logstash-Setup und -Eingabe
Der erste Schritt in unserem Logstash-Tutorial besteht darin, sicherzustellen, dass alle E-Mails, die Sie von Ihrem System erhalten, in einem Ordner landen. Da wir das gesamte Sortieren und Verwalten aus Ihrem Posteingang verlagern, spielt es keine Rolle mehr, dass es sich um einen großen Ordner handelt. Fahren Sie fort und entfernen Sie alle Ordner und Filter, die Sie bereits eingerichtet haben, und reduzieren Sie sie auf einen Ordner und einen Filter.
Verschieben Sie alle E-Mails von „[email protected]“ in den Ordner „MyAwesomeAppEmails“. Wenn Sie für diese E-Mails ein separates Postfach haben, dann wird es noch einfacher.
Jetzt können wir Logstash so einrichten, dass es diesen Ordner abfragt und die E-Mails mit dem IMAP-Plugin parst. Version 1.4.2 unterstützt nur das Abrufen von E-Mails aus dem Posteingang, aber es gibt eine relativ einfache Lösung, die in Version 1.5 angewendet wurde, um das Abrufen eines bestimmten Ordners zu ermöglichen. Wenn Sie kein separates Postfach haben, wenden Sie bitte den Patch auf das IMAP-Plugin in Ihrer Logstash-Instanz an, bevor Sie fortfahren.
# /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 } }
Dadurch werden neue E-Mails überprüft und in Logstash-Ereignisse zerlegt.
Logstash-Filter
Viele nützliche Daten werden aus E-Mails in verschiedene Ereigniseigenschaften geparst – beachten Sie, dass der E-Mail-Zeitstempel als „@timestamp“ für das Ereignis verwendet wird. Darüber hinaus können wir allein anhand der Header beispielsweise den Host identifizieren, von dem der Fehler stammt:
filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }
Dies reicht jedoch nicht aus, um Ihre Fehler-E-Mails zu bändigen. Wir brauchen ein bisschen mehr, insbesondere die folgenden drei Schritte, die beschreiben:
- Die Art des Fehlers
- Die Schwere des Fehlers
- Alle in der E-Mail enthaltenen Fehlerdetails
Nehmen wir an, Sie haben den Namen des Fehlers, z. B. „Widget Failed“, sowie den Schweregrad des Fehlers „ERROR“ wie folgt in den Betreff der E-Mail geschrieben: „ERROR: Widget Failed in /var/www/myapp/foobar .php 20“.
Wir werden dies verwenden, um mehrere Eigenschaften des Ereignisses festzulegen:

filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }
Logstash enthält eine Reihe vordefinierter Muster, die Sie in Protokollen und an anderen Stellen erwarten können. Verwenden Sie diese, um Ihre Grok-Muster aufzubauen und sie leichter lesbar zu machen. Wir haben „WORD“ (ein einzelnes Wort), „DATA“ (nicht gierige Catchall), „PATH“ (ein Unix- oder Windows-Dateipfad) und „POSINT“ (eine positive Ganzzahl) verwendet. Sie können auch den Grok-Debugger verwenden, um Ihre Grok-Muster zu debuggen. Nachrichten, die nicht dem Muster entsprechen, werden mit dem Tag „_grokparsefailure“ gekennzeichnet.
Das kümmert sich um Art, Schweregrad, Quelldatei und Zeile des Fehlers – im Grunde alle relevanten Metadaten des Ereignisses. Nun zu den Details.
Feinabstimmung von Logstash
Möglicherweise haben Sie Ihrer E-Mail zuvor eine nette Kopf- oder Fußzeilensignatur hinzugefügt, da Sie die höfliche Person sind, die Sie sind, aber jetzt ist sie im Weg. Lassen Sie uns es aus der Nachricht entfernen, ebenso wie alle abschließenden Leerzeichen, damit wir den Rest der E-Mail nach dem Fehler-Stacktrace analysieren können:
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" ] } }
Die „gsub“-Mutation verwendet das standardmäßige Ruby-Regexp-Objekt, sodass alle Optionen und Funktionen auch in Logstash verfügbar sind.
Ausgabe über Elasticsearch und Amazon SNS
Wenden wir dies auf unsere Elasticsearch-Instance an, indem wir die Logstash Elasticsearch-Ausgabe verwenden, damit wir die gesammelten Daten einfach suchen und quantifizieren können:
output { if "_grokparsefailure" not in [tags] { elasticsearch { } } }
Wir schließen alle Nachrichten aus, die nicht richtig Grok ausgeführt haben, indem wir nach dem „_grokparsefailure“-Tag suchen. Die Annahme ist, dass nur E-Mails, deren Betreff mit dem angegebenen Betreff übereinstimmt, als Fehler-E-Mails interpretiert werden sollen. Ansonsten ist es einfach und unkompliziert.
Logstash wird mit einer Fülle von Ausgaben geliefert, also verbessern wir diese noch weiter, indem wir die SNS-Ausgabe verwenden, um uns über den Simple Notification Service (SNS) von Amazon über signifikante Fehler zu informieren. Wir gehen davon aus, dass alle Fehler des Typs „meldepflichtig“ eine Benachrichtigung generieren müssen. Wenn Sie sich nicht auf einer EC2-Instance befinden, müssen Sie einen AWS-Schlüssel und ein Geheimnis angeben.
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 } } }
Das Markieren von Fehlern als „meldepflichtig“ ist Ihnen überlassen. Sie können dies tun, indem Sie sich entweder den Schweregrad des Fehlers oder die Art des Fehlers ansehen.
Jetzt können Sie wichtige E-Mails tatsächlich wieder lesen und können sicher sein, dass Sie keine wichtigen Fehler-E-Mails verpassen. Sie können auch fundierte Entscheidungen darüber treffen, welche Fehler behoben werden sollen, da Sie sehen können, wie oft ein Fehler auftritt und wann er zuletzt aufgetreten ist. Die Suche nach einem bestimmten Fehler ist dank der großartigen Suchfunktionen von Elasticsearch, die in diesem Logstash-Tutorial beschrieben werden, ebenfalls einfacher und schneller.