Структурування неструктурованих даних за допомогою GROK
Якщо ви використовуєте стек Elastic (ELK) і зацікавлені в зіставленні журналів користувача Logstash з Elasticsearch, то цей пост для вас.
Стек ELK – це абревіатура для трьох проектів із відкритим вихідним кодом: Elasticsearch, Logstash та Kibana. Разом вони утворюють платформу управління журналами.
- Elasticsearch – це пошукова та аналітична система.
- Логсташ - Це серверний конвеєр обробки даних, який приймає дані з декількох джерел одночасно, перетворює їх і потім відправляє в "схованку", наприклад Elasticsearch.
- Кібана дозволяє користувачам візуалізувати дані за допомогою діаграм та графіків у 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 == 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 виглядає так: %{SYNTAX:SEMANTIC}
Перше, що я спробував зробити, це перейти на вкладку Відкрийте для себе у відладчику Grok. Я подумав, що було б чудово, якби цей інструмент міг автоматично генерувати шаблон Grok, але це було не надто корисно, оскільки він знайшов лише два збіги.
Використовуючи це відкриття, я почав створювати власний шаблон на відладчику Grok, використовуючи синтаксис, знайдений на сторінці Github Elastic.
Погравши з різними синтаксисами, я нарешті зміг структурувати дані журналу так, як мені хотілося.
Посилання на відладчик 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 expressions шанс! Якщо у вас є інший спосіб зробити це або у вас є проблеми з прикладами вище, просто напишіть коментар нижче, щоб повідомити мені про це.
Дякую за читання - і, будь ласка, слідуйте за мною тут, на Medium, для отримання більш цікавих статей з програмної інженерії!
ресурси
Телеграм-канал з
Джерело: habr.com