การจัดโครงสร้างข้อมูลที่ไม่มีโครงสร้างด้วย GROK
หากคุณใช้สแต็ก Elastic (ELK) และสนใจที่จะแมปบันทึก Logstash แบบกำหนดเองกับ Elasticsearch โพสต์นี้เหมาะสำหรับคุณ
สแต็ก ELK เป็นตัวย่อสำหรับสามโครงการโอเพ่นซอร์ส: Elasticsearch, Logstash และ Kibana พวกเขาร่วมกันสร้างแพลตฟอร์มการจัดการบันทึก
- ElasticSearch คือระบบค้นหาและวิเคราะห์
- Logstash เป็นไปป์ไลน์การประมวลผลข้อมูลฝั่งเซิร์ฟเวอร์ที่นำเข้าข้อมูลจากหลายแหล่งพร้อมกัน แปลงข้อมูล แล้วส่งไปที่ "ที่เก็บข้อมูล" เช่น Elasticsearch
- Kibana อนุญาตให้ผู้ใช้แสดงภาพข้อมูลโดยใช้แผนภูมิและกราฟใน Elasticsearch
เต้น มาทีหลังและเป็นผู้จัดส่งข้อมูลที่มีน้ำหนักเบา การเปิดตัว Beats ได้เปลี่ยน Elk Stack ให้เป็น Elastic Stack แต่นั่นไม่ใช่ประเด็น
บทความนี้เกี่ยวกับ Grok ซึ่งเป็นฟีเจอร์ใน Logstash ที่สามารถเปลี่ยนบันทึกของคุณก่อนที่จะถูกส่งไปยังที่ซ่อน เพื่อจุดประสงค์ของเรา ฉันจะพูดถึงการประมวลผลข้อมูลจาก Logstash ไปยัง Elasticsearch เท่านั้น
Grok เป็นตัวกรองภายใน Logstash ที่ใช้ในการแยกวิเคราะห์ข้อมูลที่ไม่มีโครงสร้างเป็นสิ่งที่มีโครงสร้างและสามารถสืบค้นได้ โดยจะอยู่ด้านบนของนิพจน์ทั่วไป (regex) และใช้รูปแบบข้อความเพื่อจับคู่สตริงในไฟล์บันทึก
ดังที่เราจะเห็นในส่วนต่อไปนี้ การใช้ Grok สร้างความแตกต่างอย่างมากเมื่อพูดถึงการจัดการบันทึกที่มีประสิทธิภาพ
หากไม่มี Grok ข้อมูลบันทึกของคุณจะไม่มีโครงสร้าง
หากไม่มี Grok เมื่อบันทึกถูกส่งจาก Logstash ไปยัง Elasticsearch และแสดงผลใน Kibana บันทึกเหล่านั้นจะปรากฏเฉพาะในค่าข้อความเท่านั้น
การสืบค้นข้อมูลที่มีความหมายในสถานการณ์นี้เป็นเรื่องยากเนื่องจากข้อมูลบันทึกทั้งหมดถูกจัดเก็บไว้ในคีย์เดียว จะดีกว่านี้หากข้อความบันทึกได้รับการจัดระเบียบให้ดีขึ้น
ข้อมูลที่ไม่มีโครงสร้างจากบันทึก
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
หากคุณดูข้อมูลดิบอย่างใกล้ชิด คุณจะเห็นว่าจริงๆ แล้วข้อมูลนั้นประกอบด้วยส่วนต่างๆ กัน โดยแต่ละส่วนคั่นด้วยช่องว่าง
สำหรับนักพัฒนาที่มีประสบการณ์มากขึ้น คุณอาจเดาได้ว่าแต่ละส่วนหมายถึงอะไร และข้อความบันทึกนั้นมาจากการเรียก API อะไร การนำเสนอของแต่ละรายการมีดังต่อไปนี้
มุมมองที่มีโครงสร้างของข้อมูลของเรา
- localhost == สภาพแวดล้อม
- GET == วิธีการ
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == สถานะการตอบกลับ
- 46ms == เวลาตอบสนอง
- 5bc6e716b5d6cb35fc9687c0 == user_id
ตามที่เราเห็นในข้อมูลที่มีโครงสร้าง มีลำดับสำหรับบันทึกที่ไม่มีโครงสร้าง ขั้นตอนต่อไปคือการประมวลผลซอฟต์แวร์ของข้อมูลดิบ นี่คือจุดที่ Grok เปล่งประกาย
เทมเพลต Grok
เทมเพลต Grok ในตัว
Logstash มาพร้อมกับเทมเพลตในตัวมากกว่า 100 รายการสำหรับจัดโครงสร้างข้อมูลที่ไม่มีโครงสร้าง คุณควรใช้ประโยชน์จากสิ่งนี้อย่างแน่นอนทุกครั้งที่เป็นไปได้สำหรับ syslogs ทั่วไป เช่น apache, linux, haproxy, aws และอื่นๆ
แต่จะเกิดอะไรขึ้นเมื่อคุณมีบันทึกที่กำหนดเองตามตัวอย่างด้านบน คุณต้องสร้างเทมเพลต Grok ของคุณเอง
เทมเพลต Grok แบบกำหนดเอง
คุณต้องพยายามสร้างเทมเพลต Grok ของคุณเอง ฉันใช้
โปรดทราบว่าไวยากรณ์เทมเพลต Grok เป็นดังนี้: %{SYNTAX:SEMANTIC}
สิ่งแรกที่ฉันพยายามทำคือไปที่แท็บ ค้นพบ ในดีบักเกอร์ Grok ฉันคิดว่าคงจะดีถ้าเครื่องมือนี้สามารถสร้างรูปแบบ Grok ได้โดยอัตโนมัติ แต่ก็ไม่ได้มีประโยชน์มากนักเนื่องจากพบเพียงสองรายการที่ตรงกันเท่านั้น
จากการค้นพบนี้ ฉันเริ่มสร้างเทมเพลตของตัวเองใน Grok debugger โดยใช้ไวยากรณ์ที่พบในหน้า Elastic Github
หลังจากลองใช้ไวยากรณ์ต่างๆ แล้ว ในที่สุดฉันก็สามารถจัดโครงสร้างข้อมูลบันทึกตามที่ฉันต้องการได้
ลิงก์ดีบักเกอร์ Grok
ข้อความต้นฉบับ:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
รูปแบบ:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
เกิดอะไรขึ้นในตอนจบ
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
ด้วยเทมเพลต Grok และข้อมูลที่แมปไว้ในมือ ขั้นตอนสุดท้ายคือการเพิ่มลงใน Logstash
การอัพเดตไฟล์คอนฟิกูเรชัน Logstash.conf
บนเซิร์ฟเวอร์ที่คุณติดตั้งสแตก ELK ให้ไปที่การกำหนดค่า Logstash:
sudo vi /etc/logstash/conf.d/logstash.conf
วางการเปลี่ยนแปลง
input {
file {
path => "/your_logs/*.log"
}
}
filter{
grok {
match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}"}
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
หลังจากบันทึกการเปลี่ยนแปลงแล้ว ให้รีสตาร์ท Logstash และตรวจสอบสถานะเพื่อให้แน่ใจว่ายังคงใช้งานได้
sudo service logstash restart
sudo service logstash status
สุดท้ายนี้ เพื่อให้แน่ใจว่าการเปลี่ยนแปลงมีผล อย่าลืมอัปเดตดัชนี Elasticsearch ของคุณสำหรับ Logstash ใน Kibana!
ด้วย Grok ข้อมูลบันทึกของคุณมีโครงสร้าง!
ดังที่เราเห็นในภาพด้านบน Grok สามารถจับคู่ข้อมูลบันทึกกับ Elasticsearch ได้โดยอัตโนมัติ ทำให้ง่ายต่อการจัดการบันทึกและสืบค้นข้อมูลได้อย่างรวดเร็ว แทนที่จะขุดไฟล์บันทึกเพื่อแก้ไขข้อบกพร่อง คุณสามารถกรองตามสิ่งที่คุณกำลังมองหา เช่น สภาพแวดล้อมหรือ URL
ลองใช้สำนวน Grok สิ! หากคุณมีวิธีอื่นในการทำเช่นนี้หรือมีปัญหากับตัวอย่างข้างต้น เพียงเขียนความคิดเห็นด้านล่างเพื่อแจ้งให้เราทราบ
ขอบคุณสำหรับการอ่าน—และโปรดติดตามฉันที่นี่บน Medium สำหรับบทความวิศวกรรมซอฟต์แวร์ที่น่าสนใจเพิ่มเติม!
Ресурсы
ช่องทางโทรเลขโดย
ที่มา: will.com