Logstashチュートリアル:Logstashを使用して電子メール通知を合理化する
公開: 2022-03-11エラーや例外を報告するための主要なメカニズムとしてメールを使用するアプリは、最初は常に良い考えのように思われます。 Java開発者として、私たちは「ねえ、何かがうまくいかないときはすぐにわかります!」と考えています。
ただし、ある時点で、エラーの電子メールがあなたから遠ざかっていることに気付くはずであり、電子メールの受信トレイをクリーンアップする必要があります。 404を無視することができ(ほとんどの場合)、新しいサインアップの通知を受け取るのは良いことですが、結局のところ、それは少し忙しすぎたり、時間がかかったりする可能性があります。
遅かれ早かれ、「実用的な」電子メールと無意味な通知を区別することは困難になります。 メールにルールとフィルターを設定することはできますが、これらでも管理できなくなる可能性があります。
このJavaチュートリアルでは、Logstashを使用して制御を取り戻し、電子メールの受信トレイをクリーンアップして、エラー電子メールを再び管理できるようにする可能性について説明します。すべて、アプリ内の1つの変更は必要ありません。
Logstashのセットアップと入力
Logstashチュートリアルの最初のステップは、システムから受信するすべての電子メールが1つのフォルダーに確実に送信されるようにすることです。 すべての並べ替えと管理を受信トレイから移動しているので、それが1つの大きなフォルダであるかどうかは問題ではありません。 先に進んで、すでに設定したすべてのフォルダーとフィルターを削除し、1つのフォルダーと1つのフィルターに減らします。
すべての電子メールを「[email protected]」から「MyAwesomeAppEmails」フォルダーに移動します。 これらの電子メール用に別のメールボックスがある場合は、さらに簡単になります。
これで、Logstashを設定して、そのフォルダーをポーリングし、IMAPプラグインを使用してメールを解析できます。 バージョン1.4.2は、受信トレイからの電子メールのプルのみをサポートしますが、特定のフォルダーのポーリングを可能にするためにバージョン1.5で適用された比較的単純な修正があります。 別のメールボックスがない場合は、続行する前に、LogstashインスタンスのIMAPプラグインにパッチを適用してください。
# /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イベントに解析されます。
Logstashフィルター
多くの有用なデータが電子メールからさまざまなイベントプロパティに解析されます。電子メールのタイムスタンプがイベントの「@timestamp」として使用されていることに注意してください。 さらに、ヘッダーだけから、エラーの原因となったホストを特定するなどのことができます。
filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }
ただし、これだけではエラーメールを抑えるには不十分です。 もう少し、具体的には次の3つの手順を説明する必要があります。
- エラーの種類
- エラーの重大度
- メールに含まれるエラーの詳細
エラーの名前(例:「WidgetFailed」)と、エラーの重大度「ERROR」を次のようにメールの件名に入力したとします。「ERROR:Widget Failed in / var / www / myapp/foobar」 .php20インチ。
これを使用して、イベントのいくつかのプロパティを設定します。

filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }
Logstashには、ログやその他のさまざまな場所に表示されると予想される、事前定義されたパターンがいくつか付属しています。 これらを使用して、Grokパターンを構築し、読みやすくします。 「WORD」(単一の単語)、「DATA」(貪欲でないキャッチオール)、「PATH」(UnixまたはWindowsのファイルパス)、および「POSINT」(正の整数)を使用しました。 GrokDebuggerを使用して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」ミューテーションは標準のRubyRegexpオブジェクトを使用するため、すべてのオプションと機能はlogstashでも使用できます。
ElasticsearchとAmazonSNSを介した出力
Logstash Elasticsearchの出力を使用してこれをElasticsearchインスタンスに適用して、収集しているデータを簡単に検索して定量化できるようにします。
output { if "_grokparsefailure" not in [tags] { elasticsearch { } } }
「_grokparsefailure」タグをチェックすることにより、正しくGrokされなかったすべてのメッセージを除外します。 件名が指定された件名と一致する電子メールのみがエラー電子メールとして解釈されることを前提としています。 そうでなければ、それは単純で簡単です。
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 } } }
エラーに「通知可能」のタグを付けるのはあなた次第です。 これを行うには、エラーの重大度またはエラーのタイプを確認します。
これで、重要なメールを実際にもう一度読むことができ、重要なエラーメールを見逃すことはありません。 エラーが発生する頻度と最後に発生した時期を確認できるため、修正するエラーについて情報に基づいた決定を行うこともできます。 このLogstashチュートリアルで概説されているElasticsearchの優れた検索機能のおかげで、特定のエラーの検索もより簡単かつ迅速になります。