Поради та рекомендації щодо перетворення неструктурованих даних з логів у ELK Stack використовуючи GROK у LogStash

Структурування неструктурованих даних за допомогою GROK

Якщо ви використовуєте стек Elastic (ELK) і зацікавлені в зіставленні журналів користувача Logstash з Elasticsearch, то цей пост для вас.

Поради та рекомендації щодо перетворення неструктурованих даних з логів у ELK Stack використовуючи GROK у LogStash

Стек ELK – це абревіатура для трьох проектів із відкритим вихідним кодом: Elasticsearch, Logstash та Kibana. Разом вони утворюють платформу управління журналами.

  • Elasticsearch – це пошукова та аналітична система.
  • Логсташ - Це серверний конвеєр обробки даних, який приймає дані з декількох джерел одночасно, перетворює їх і потім відправляє в "схованку", наприклад Elasticsearch.
  • Кібана дозволяє користувачам візуалізувати дані за допомогою діаграм та графіків у 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

Додати коментар або відгук