คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

การจัดโครงสร้างข้อมูลที่ไม่มีโครงสร้างด้วย GROK

หากคุณใช้สแต็ก Elastic (ELK) และสนใจที่จะแมปบันทึก Logstash แบบกำหนดเองกับ Elasticsearch โพสต์นี้เหมาะสำหรับคุณ

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

สแต็ก ELK เป็นตัวย่อสำหรับสามโครงการโอเพ่นซอร์ส: Elasticsearch, Logstash และ Kibana พวกเขาร่วมกันสร้างแพลตฟอร์มการจัดการบันทึก

  • ElasticSearch คือระบบค้นหาและวิเคราะห์
  • Logstash เป็นไปป์ไลน์การประมวลผลข้อมูลฝั่งเซิร์ฟเวอร์ที่นำเข้าข้อมูลจากหลายแหล่งพร้อมกัน แปลงข้อมูล แล้วส่งไปที่ "ที่เก็บข้อมูล" เช่น Elasticsearch
  • Kibana อนุญาตให้ผู้ใช้แสดงภาพข้อมูลโดยใช้แผนภูมิและกราฟใน Elasticsearch

เต้น มาทีหลังและเป็นผู้จัดส่งข้อมูลที่มีน้ำหนักเบา การเปิดตัว Beats ได้เปลี่ยน Elk Stack ให้เป็น Elastic Stack แต่นั่นไม่ใช่ประเด็น

บทความนี้เกี่ยวกับ Grok ซึ่งเป็นฟีเจอร์ใน Logstash ที่สามารถเปลี่ยนบันทึกของคุณก่อนที่จะถูกส่งไปยังที่ซ่อน เพื่อจุดประสงค์ของเรา ฉันจะพูดถึงการประมวลผลข้อมูลจาก Logstash ไปยัง Elasticsearch เท่านั้น

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

Grok เป็นตัวกรองภายใน Logstash ที่ใช้ในการแยกวิเคราะห์ข้อมูลที่ไม่มีโครงสร้างเป็นสิ่งที่มีโครงสร้างและสามารถสืบค้นได้ โดยจะอยู่ด้านบนของนิพจน์ทั่วไป (regex) และใช้รูปแบบข้อความเพื่อจับคู่สตริงในไฟล์บันทึก

ดังที่เราจะเห็นในส่วนต่อไปนี้ การใช้ Grok สร้างความแตกต่างอย่างมากเมื่อพูดถึงการจัดการบันทึกที่มีประสิทธิภาพ

หากไม่มี Grok ข้อมูลบันทึกของคุณจะไม่มีโครงสร้าง

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

หากไม่มี 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 ดีบักเกอร์ и รูปแบบ Grok.

โปรดทราบว่าไวยากรณ์เทมเพลต Grok เป็นดังนี้: %{SYNTAX:SEMANTIC}

สิ่งแรกที่ฉันพยายามทำคือไปที่แท็บ ค้นพบ ในดีบักเกอร์ Grok ฉันคิดว่าคงจะดีถ้าเครื่องมือนี้สามารถสร้างรูปแบบ Grok ได้โดยอัตโนมัติ แต่ก็ไม่ได้มีประโยชน์มากนักเนื่องจากพบเพียงสองรายการที่ตรงกันเท่านั้น

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

จากการค้นพบนี้ ฉันเริ่มสร้างเทมเพลตของตัวเองใน Grok debugger โดยใช้ไวยากรณ์ที่พบในหน้า Elastic Github

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

หลังจากลองใช้ไวยากรณ์ต่างๆ แล้ว ในที่สุดฉันก็สามารถจัดโครงสร้างข้อมูลบันทึกตามที่ฉันต้องการได้

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

ลิงก์ดีบักเกอร์ Grok https://grokdebug.herokuapp.com/

ข้อความต้นฉบับ:

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!

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

ด้วย Grok ข้อมูลบันทึกของคุณมีโครงสร้าง!

คำแนะนำและเคล็ดลับในการแปลงข้อมูลที่ไม่มีโครงสร้างจากบันทึกเป็น ELK Stack โดยใช้ GROK ใน LogStash

ดังที่เราเห็นในภาพด้านบน Grok สามารถจับคู่ข้อมูลบันทึกกับ Elasticsearch ได้โดยอัตโนมัติ ทำให้ง่ายต่อการจัดการบันทึกและสืบค้นข้อมูลได้อย่างรวดเร็ว แทนที่จะขุดไฟล์บันทึกเพื่อแก้ไขข้อบกพร่อง คุณสามารถกรองตามสิ่งที่คุณกำลังมองหา เช่น สภาพแวดล้อมหรือ URL

ลองใช้สำนวน Grok สิ! หากคุณมีวิธีอื่นในการทำเช่นนี้หรือมีปัญหากับตัวอย่างข้างต้น เพียงเขียนความคิดเห็นด้านล่างเพื่อแจ้งให้เราทราบ

ขอบคุณสำหรับการอ่าน—และโปรดติดตามฉันที่นี่บน Medium สำหรับบทความวิศวกรรมซอฟต์แวร์ที่น่าสนใจเพิ่มเติม!

Ресурсы

https://www.elastic.co/blog/do-you-grok-grok
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
https://grokdebug.herokuapp.com/

PS ลิงค์แหล่งที่มา

ช่องทางโทรเลขโดย ElasticSearch

ที่มา: will.com

เพิ่มความคิดเห็น