Как использовать Grok для структурирования неструктурированных данных в Logstash

Если вы используете стек Elastic (ELK) и заинтересованы в отображении пользовательских журналов Logstash в Elasticsearch, то эта заметка для вас.

ELK Stack - это аббревиатура трех проектов с открытым исходным кодом: Elasticsearch, Logstash и Kibana. Вместе они образуют платформу для управления журналами.

  • Elasticsearch - это поисковый и аналитический механизм.
  • Logstash - это конвейер обработки данных на стороне сервера, который получает данные из нескольких источников одновременно, преобразует их, а затем отправляет в "хранилище", подобное Elasticsearch.
  • Kibana позволяет пользователям визуализировать данные с помощью диаграмм и графиков в Elasticsearch.
  • Beats появился позже и представляет собой легкий отправитель данных. Внедрение Beats превратило ELK Stack в Elastic Stack, но это не суть важно.

Эта статья посвящена Grok - функции в Logstash, которая может преобразовывать ваши журналы перед их отправкой в хранилище. Для наших целей я буду говорить только об обработке данных из Logstash в Elasticsearch.

Grok

Grok - это фильтр в Logstash, который используется для разбора неструктурированных данных на структурированные и пригодные для запросов. Он располагается поверх регулярного выражения (regex) и использует текстовые шаблоны для сопоставления строк в файлах журнала.

Как мы увидим в следующих разделах, использование Grok значительно улучшает эффективное управление журналами.

Без Grok ваши данные журнала будут неструктурированными

Одна строка журнала в Kibana.

Без Grok, когда журналы отправляются из Logstash в Elasticsearch и отображаются в Kibana, они появляются только в значении сообщения.

В такой ситуации сложно выполнить запрос на получение значимой информации, поскольку все данные журнала хранятся в одном ключе. Было бы лучше, если бы сообщения журнала были организованы лучше.

Данные журнала

Неструктурированные данные

Если вы внимательно посмотрите на необработанные данные, то увидите, что они состоят из различных частей, каждая из которых разделена пробелом.

Более опытные разработчики, вероятно, догадаются, что означает каждая из этих частей и что это сообщение журнала, полученное в результате вызова API. Представление каждого элемента описано ниже.

Структурированный

  • localhost == environment
  • GET == method
  • /v2/applink/5c2f4bb3e9fda1234edc64d == url
  • 400 == response_status
  • 46 мс == response_time
  • 5bc6e716b5d6cb35fc9687c0 == user_id

Как мы можем видеть, в структурированных данных есть порядок, как и в неструктурированных журналах. Следующий шаг - программная обработка необработанных данных. Именно здесь Grok проявляет себя наилучшим образом.

Паттерны Grok

Встроенные

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

Однако что происходит, когда у вас есть пользовательские журналы, как в примере выше? Вы должны создать свой собственный шаблон Grok.

Пользовательский

Чтобы создать свой собственный пользовательский паттерн Grok, нужны пробы и ошибки. Я использовал отладчик Grok Debugger и шаблоны Grok Patterns, чтобы разобраться в этом.

Обратите внимание, что синтаксис шаблонов Grok следующий: %{SYNTAX:SEMANTIC}.

Первое, что я попытался сделать, это перейти на вкладку Discover в Grok Debugger. Я подумал, что было бы здорово, если бы этот инструмент мог автоматически генерировать паттерн Grok, но это не слишком помогло, поскольку он нашел только два совпадения.

Grok Debugger 'Discover' соответствует только 2 словамИспользуя это открытие, я начал строить свой собственный паттерн на Grok Debugger, используя синтаксис, найденный на странице Elastic на github.

https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

Поиграв с различными синтаксисами, я, наконец, смог структурировать данные журнала так, как мне хотелось.

Структурирование неструктурированных данных журнала с помощью Grok Debugger

Имея на руках шаблон Grok и отображенные данные, последний шаг - добавить их в Logstash.

Обновление Logstash.conf

На сервере, на котором вы установили стек ELK, перейдите в Logstash config.

Вставьте изменения.

После сохранения изменений перезапустите Logstash и проверьте его состояние, чтобы убедиться, что он по-прежнему работает.

И наконец, чтобы убедиться, что изменения вступили в силу, не забудьте обновить индекс Elasticsearch для Logstash в Kibana!

Обновление индекса Elasticsearch для Logstash в Kibana

С Grok ваши данные журнала структурированы!

Grok автоматически структурирует неструктурированные журналы

Как видно на изображении выше, Grok способен автоматически отображать данные журналов в Elasticsearch. Это облегчает управление журналами и быстрый поиск информации. Вместо того чтобы копаться в логах для отладки, вы можете просто отфильтровать их по нужным параметрам, таким как окружение или url.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий