บทช่วยสอน 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

เหตุการณ์ logstash

ตัวกรอง Logstash

ข้อมูลที่เป็นประโยชน์จำนวนมากถูกแยกวิเคราะห์จากอีเมลไปยังคุณสมบัติของเหตุการณ์ต่างๆ - โปรดสังเกตว่าการประทับเวลาของอีเมลถูกใช้เป็น “@timestamp” สำหรับกิจกรรม ยิ่งไปกว่านั้น จากส่วนหัวเพียงอย่างเดียว เราสามารถทำสิ่งต่างๆ เช่น ระบุโฮสต์ที่ข้อผิดพลาดเกิดขึ้นได้:

 filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }

อย่างไรก็ตาม สิ่งนี้ไม่เพียงพอที่จะจัดการกับอีเมลแสดงข้อผิดพลาดของคุณ เราต้องการอีกเล็กน้อย โดยเฉพาะสามขั้นตอนต่อไปนี้ที่อธิบาย:

  • ประเภทของข้อผิดพลาด
  • ความรุนแรงของข้อผิดพลาด
  • รายละเอียดข้อผิดพลาดใด ๆ ที่รวมอยู่ในอีเมล

สมมติว่าคุณใส่ชื่อของข้อผิดพลาด เช่น "Widget Failed" รวมทั้งความรุนแรงของข้อผิดพลาด "ERROR" ในเรื่องอีเมลดังนี้: "ERROR: Widget Failed in /var/www/myapp/foobar .php 20”

เราจะใช้สิ่งนี้เพื่อกำหนดคุณสมบัติหลายอย่างของเหตุการณ์:

 filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }

Logstash มาพร้อมกับรูปแบบที่กำหนดไว้ล่วงหน้าจำนวนหนึ่ง ซึ่งคุณจะได้เห็นในบันทึกและที่อื่นๆ ใช้สิ่งเหล่านี้เพื่อสร้างรูปแบบ Grok ของคุณและทำให้อ่านง่ายขึ้น เราใช้ “WORD” (คำเดียว), “DATA” ( catchall ที่ไม่โลภ), “PATH” (เส้นทางไฟล์ Unix หรือ Windows) และ “POSINT” (จำนวนเต็มบวก) คุณยังสามารถใช้ Grok Debugger เพื่อดีบักรูปแบบ Grok ของคุณ ข้อความที่ไม่ตรงกับรูปแบบจะถูกแท็กด้วยแท็ก “_grokparsefailure”

ที่ดูแลประเภท ความรุนแรง ไฟล์ต้นฉบับ และบรรทัดของข้อผิดพลาด - โดยทั่วไปแล้วข้อมูลเมตาที่เกี่ยวข้องทั้งหมดของเหตุการณ์ ตอนนี้ไปที่รายละเอียด

ปรับแต่ง Logstash

ก่อนหน้านี้คุณอาจเคยเพิ่มลายเซ็นส่วนหัวหรือส่วนท้ายที่ดีลงในอีเมลของคุณแล้ว เนื่องจากคุณเป็นคนสุภาพ แต่ตอนนี้มันกำลังขวางทางอยู่ ลบออกจากข้อความ รวมทั้งช่องว่างต่อท้าย เพื่อให้เราสามารถแยกวิเคราะห์อีเมลที่เหลือสำหรับข้อผิดพลาด stacktrace:

 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 เพื่อแจ้งให้เราทราบถึงข้อผิดพลาดที่สำคัญโดยใช้ Simple Notification Service (SNS) ของ Amazon เราจะถือว่าข้อผิดพลาดประเภท "แจ้ง" ทั้งหมดจำเป็นต้องสร้างการแจ้งเตือน หากคุณไม่ได้ใช้อินสแตนซ์ 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 นี้