Раздел 40 · Elasticsearch и ELK

Парсинг логов с grok

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке пайплайн научился выбрасывать шум и ставить теги, но строка лога так и осталась одной длинной строкой в message. Пора разобрать её на поля. Для этого в Logstash есть фильтр grok, самый известный и самый капризный инструмент стека.

Трафарет для строки

Строка access-лога nginx «Гонца» выглядит так:

92.100.101.105 - - [30/Jun/2026:22:40:11 +0300] "POST /api/payments HTTP/1.1" 504 167 "-" "Gonets/5.1.3 (iOS 17.5; iPhone14,2)" rt=30.004 urt="30.003"

Человек сразу видит: адрес клиента, время, метод, путь, код ответа 504, размер ответа, приложение клиента и время запроса 30 секунд. Компьютеру надо объяснить, где что лежит. Представь трафарет: картонку с вырезами, которую кладут на строку. Сквозь каждый вырез видна одна часть: «здесь адрес», «здесь время», «здесь код».

Grok и есть такой трафарет. Шаблон собирается из готовых кусков вида %{ШАБЛОН:поле}:

  • %{IP:[source][address]} значит «здесь IP-адрес, положи его в поле source.address»;
  • %{NUMBER:[http][response][status_code]:int} значит «здесь число, положи в поле и сделай целым»;
  • обычный текст между кусками, например пробелы и rt=, должен совпасть буква в букву.

Каждый кусок это заранее написанное регулярное выражение с понятным именем. В Logstash их больше трёхсот: IP, NUMBER, WORD, DATA, GREEDYDATA, HTTPDATE, LOGLEVEL, UUID и другие.

Готовые шаблоны для известных логов

Для популярных форматов есть шаблоны целиком. %{COMBINEDAPACHELOG} разбирает формат combined, который по умолчанию пишут Apache и nginx. В Logstash 9 он сразу кладёт значения в поля ECS: source.address, http.request.method, url.original, http.response.status_code, user_agent.original.

Строка «Гонца» длиннее стандартной: в конце nginx дописывает rt= и urt=, время ответа nginx и сервиса за ним. Для них допишем свои куски после готового шаблона.

урок из курса

Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.