Парады і рэкамендацыі па пераўтварэнні неструктураваных дадзеных з логаў у 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 == environment
  • ​ GET == method
  • ​ /v2/applink/5c2f4bb3e9fda1234edc64d == url
  • ​ 400 == response_status
  • ​ 46ms == response_time
  • ​ 5bc6e716b5d6cb35fc9687c0 == user_id

Як мы бачым у структураваных дадзеных, існуе парадак для неструктураваных часопісаў. Наступны крок - гэта праграмная апрацоўка неапрацаваных дадзеных. Вось дзе Грок ззяе.

Шаблоны Grok

Убудаваныя шаблоны Grok

Logstash пастаўляецца з больш за 100 убудаванымі шаблонамі для структуравання неструктураваных дадзеных. Вы, безумоўна, павінны скарыстацца гэтай перавагай, калі гэта магчыма для агульных сістэмных часопісаў, такіх як apache, linux, haproxy, aws і гэтак далей.

Аднак што адбываецца, калі ў вас ёсць карыстацкія часопісы, як у прыведзеным вышэй прыкладзе? Вы павінны пабудаваць свой уласны шаблон Grok.

Кастомныя шаблоны Grok

Трэба паспрабаваць, каб пабудаваць свой уласны шаблон Grok. Я выкарыстаў Grok Debugger и Grok Patterns.

Звярніце ўвагу, што сінтаксіс шаблонаў Grok выглядае наступным чынам: %{SYNTAX:SEMANTIC}

Першае, што я паспрабаваў зрабіць, гэта перайсці на ўкладку Адкрыйце для сябе у адладчыку Grok. Я падумаў, што было б выдатна, калі б гэты інструмент мог аўтаматычна генераваць шаблон Grok, але гэта было не занадта карысна, бо ён знайшоў толькі два супадзенні.

Парады і рэкамендацыі па пераўтварэнні неструктураваных дадзеных з логаў у ELK Stack выкарыстоўваючы GROK у LogStash

Выкарыстоўваючы гэтае адкрыццё, я пачаў ствараць свой уласны шаблон на адладчыку Grok, выкарыстоўваючы сінтаксіс, знойдзены на старонцы Github Elastic.

Парады і рэкамендацыі па пераўтварэнні неструктураваных дадзеных з логаў у 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 expressions шанец! Калі ў вас ёсць іншы спосаб зрабіць гэта ці ў вас ёсць якія-небудзь праблемы з прыкладамі вышэй, проста напішыце каментар ніжэй, каб паведаміць мне пра гэта.

Дзякуй за чытанне - і, калі ласка, прытрымлівайцеся за мной тут, на 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

Крыніца: habr.com

Дадаць каментар