В прошлом уроке пайплайн научился выбрасывать шум и ставить теги, но строка лога так и осталась одной длинной строкой в 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.