Tutorial Logstash: Menggunakan Logstash untuk Merampingkan Notifikasi Email
Diterbitkan: 2022-03-11Aplikasi yang menggunakan email sebagai mekanisme utama untuk melaporkan kesalahan dan pengecualian selalu tampak seperti ide yang bagus pada awalnya. Sebagai Pengembang Java, kami berpikir, "hei, saya akan segera tahu jika ada yang tidak beres!"
Namun, pada titik tertentu Anda pasti akan menyadari bahwa email kesalahan semakin menjauh dari Anda dan Anda perlu membersihkan kotak masuk email Anda. Anda dapat mengabaikan 404 (sebagian besar waktu), dan menerima pemberitahuan pendaftaran baru mungkin menyenangkan, tetapi pada akhirnya mungkin menjadi sedikit terlalu sibuk atau memakan waktu.
Cepat atau lambat, membedakan email yang “dapat ditindaklanjuti” dari notifikasi yang tidak berguna menjadi sulit. Anda dapat mengatur aturan dan filter di email Anda, tetapi bahkan ini bisa mulai menjadi tidak terkendali.
Tutorial Java ini akan melihat kemungkinan menggunakan Logstash untuk mendapatkan kembali kontrol dan membersihkan kotak masuk email Anda dan membuat email kesalahan Anda dapat dikelola kembali, semuanya tanpa mengubah satu hal pun di aplikasi Anda.
Pengaturan dan Masukan Logstash
Langkah pertama dalam tutorial Logstash kami adalah memastikan bahwa semua email yang Anda terima dari sistem Anda masuk ke satu folder. Karena kami memindahkan semua penyortiran dan pengelolaan dari kotak masuk Anda, tidak masalah jika itu adalah satu folder besar lagi. Lanjutkan dan hapus semua folder dan filter yang sudah Anda siapkan, dan kurangi menjadi satu folder dan satu filter.
Pindahkan semua email dari “[email protected]” ke folder “MyAwesomeAppEmails”. Jika Anda memiliki kotak surat terpisah untuk email ini, maka akan lebih mudah.
Sekarang kita dapat mengatur Logstash untuk melakukan polling folder itu dan mem-parsing email menggunakan plugin IMAP. Versi 1.4.2 hanya mendukung penarikan email dari Kotak Masuk, tetapi ada perbaikan yang relatif sederhana yang telah diterapkan di versi 1.5 untuk memungkinkan polling folder tertentu. Jika Anda tidak memiliki kotak surat terpisah, harap terapkan tambalan ke plugin IMAP di instans Logstash Anda sebelum melanjutkan.
# /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 } }
Ini akan mulai memeriksa email baru dan menguraikannya ke dalam acara Logstash.
Filter Logstash
Banyak data berguna yang diuraikan dari email ke properti acara yang berbeda - perhatikan bahwa stempel waktu email digunakan sebagai "@cap waktu" untuk acara tersebut. Lebih jauh lagi, dari header saja kita dapat melakukan hal-hal seperti mengidentifikasi Host asal kesalahan:
filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }
Namun, ini tidak cukup untuk menjinakkan email kesalahan Anda. Kami membutuhkan sedikit lebih banyak, khususnya tiga langkah berikut yang menjelaskan:
- Jenis kesalahan
- Tingkat keparahan kesalahan
- Detail kesalahan apa pun termasuk dalam email
Mari kita asumsikan Anda menempatkan nama kesalahan, misalnya “Widget Failed”, serta tingkat keparahan kesalahan “ERROR” di subjek email seperti ini: “ERROR: Widget Failed in /var/www/myapp/foobar .php 20”.
Kami akan menggunakan ini untuk mengatur beberapa properti acara:

filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }
Logstash hadir dengan sejumlah pola standar yang dapat Anda lihat di log, dan berbagai tempat lainnya. Gunakan ini untuk membangun pola Grok Anda dan membuatnya lebih mudah dibaca. Kami telah menggunakan "WORD" (satu kata), "DATA" (non-serakah catchall), "PATH" (jalur file Unix atau Windows) dan "POSINT" (bilangan bulat positif). Anda juga dapat menggunakan Grok Debugger untuk men-debug pola Grok Anda. Pesan yang tidak sesuai dengan pola akan ditandai dengan tag “_grokparsefailure”.
Itu menangani jenis, tingkat keparahan, file sumber, dan baris kesalahan - pada dasarnya semua data meta yang relevan dari acara tersebut. Sekarang ke detailnya.
Logstash Penyetelan Halus
Anda mungkin sebelumnya telah menambahkan tanda tangan header atau footer yang bagus ke email Anda, menjadi orang yang sopan seperti Anda, tetapi sekarang hal itu menghalangi. Mari kita hapus dari pesan, serta spasi kosong apa pun sehingga kita dapat mengurai sisa email untuk stacktrace kesalahan:
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" ] } }
Mutasi “gsub” menggunakan objek Regexp Ruby standar, sehingga semua opsi dan fitur juga tersedia di logstash.
Keluaran melalui Elasticsearch dan Amazon SNS
Mari kita terapkan ini pada instance Elasticsearch kita menggunakan output Logstash Elasticsearch sehingga kita dapat dengan mudah mencari dan mengukur data yang kita kumpulkan:
output { if "_grokparsefailure" not in [tags] { elasticsearch { } } }
Kami mengecualikan semua pesan yang tidak menggunakan Grok dengan benar dengan memeriksa tag “_grokparsefailure”. Asumsinya adalah hanya email yang subjeknya cocok dengan subjek yang ditentukan yang harus ditafsirkan sebagai email kesalahan. Jika tidak, itu sederhana dan mudah.
Logstash hadir dengan banyak keluaran, jadi mari tingkatkan ini lebih jauh lagi menggunakan keluaran SNS untuk memberi tahu kami tentang kesalahan signifikan menggunakan Layanan Pemberitahuan Sederhana (SNS) Amazon. Kami akan berasumsi bahwa semua kesalahan jenis "notifiable" perlu menghasilkan pemberitahuan. Jika Anda tidak menggunakan instans EC2, Anda harus menentukan kunci dan rahasia 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 } } }
Kesalahan penandaan sebagai "dapat diberitahukan" terserah Anda. Anda dapat melakukannya dengan melihat tingkat keparahan kesalahan atau melihat jenis kesalahan.
Sekarang Anda benar-benar dapat membaca email penting lagi, dan Anda dapat yakin bahwa Anda tidak akan melewatkan email kesalahan penting. Anda juga dapat membuat keputusan yang tepat tentang kesalahan apa yang harus diperbaiki, karena Anda dapat melihat seberapa sering kesalahan terjadi dan kapan kesalahan itu terjadi terakhir kali. Mencari kesalahan tertentu juga lebih mudah dan lebih cepat, berkat kekuatan pencarian yang luar biasa dari Elasticsearch yang diuraikan dalam tutorial Logstash ini.