Пример: Парсинг логов в формате Common Log Format
В этом учебном примере вы будете использовать конвейер обработки данных для парсинга серверных логов в формате Common Log Format перед индексированием. Перед началом ознакомьтесь с предварительными требованиями к конвейерам обработки данных.
Логи, которые вы хотите обработать, выглядят примерно так:
212.87.37.154 - - [30/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"
Эти логи содержат временную метку, IP-адрес и пользовательский агент. Вы хотите, чтобы эти три элемента имели собственные поля в Elasticsearch для более быстрых поисков и визуализации. Вы также хотите знать, откуда поступает запрос.
-
В Kibana откройте главное меню и нажмите Управление стеком > Конвейеры обработки данных.
- Нажмите Создать конвейер.
- Укажите имя и описание для конвейера.
-
Добавьте процессор Grok для парсинга сообщения лога:
- Нажмите Добавить процессор и выберите тип процессора Grok.
-
Установите Поле на
messageи Шаблоны на следующий шаблон Grok:%{IPORHOST:source.ip} %{USER:user.id} %{USER:user.name} \\[%{HTTPDATE:@timestamp}\\] \"%{WORD:http.request.method} %{DATA:url.original} HTTP/%{NUMBER:http.version}\" %{NUMBER:http.response.status_code:int} (?:-|%{NUMBER:http.response.body.bytes:int}) %{QS:http.request.referrer} %{QS:user_agent} - Нажмите Добавить, чтобы сохранить процессор.
- Установите описание процессора на
Extract fields from 'message'.
-
Добавьте процессоры для полей временной метки, IP-адреса и пользовательского агента. Настройте процессоры следующим образом:
Тип процессора Поле Дополнительные параметры Описание @timestampФорматы:
dd/MMM/yyyy:HH:mm:ss ZFormat '@timestamp' as 'dd/MMM/yyyy:HH:mm:ss Z'source.ipЦелевое поле:
source.geoAdd 'source.geo' GeoIP data for 'source.ip'user_agentExtract fields from 'user_agent'Ваша форма должна выглядеть примерно так:
Четыре процессора будут выполняться последовательно:
Grok > Дата > GeoIP > Пользовательский агент
Вы можете изменить порядок процессоров, используя значки стрелок.В качестве альтернативы вы можете щелкнуть ссылку Импортировать процессоры и определить процессоры как JSON:
{ "processors": [ { "grok": { "description": "Extract fields from 'message'", "field": "message", "patterns": ["%{IPORHOST:source.ip} %{USER:user.id} %{USER:user.name} \\[%{HTTPDATE:@timestamp}\\] \"%{WORD:http.request.method} %{DATA:url.original} HTTP/%{NUMBER:http.version}\" %{NUMBER:http.response.status_code:int} (?:-|%{NUMBER:http.response.body.bytes:int}) %{QS:http.request.referrer} %{QS:user_agent}"] } }, { "date": { "description": "Format '@timestamp' as 'dd/MMM/yyyy:HH:mm:ss Z'", "field": "@timestamp", "formats": [ "dd/MMM/yyyy:HH:mm:ss Z" ] } }, { "geoip": { "description": "Add 'source.geo' GeoIP data for 'source.ip'", "field": "source.ip", "target_field": "source.geo" } }, { "user_agent": { "description": "Extract fields from 'user_agent'", "field": "user_agent" } } ] } - Чтобы протестировать конвейер, нажмите Добавить документы.
-
На вкладке Документы укажите пример документа для тестирования:
[ { "_source": { "message": "212.87.37.154 - - [05/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"" } } ] - Нажмите Запустить конвейер и проверьте, что конвейер работал как ожидалось.
-
Если все выглядит правильно, закройте панель, а затем нажмите Создать конвейер.
Теперь вы готовы индексировать данные логов в поток данных.
-
Создайте шаблон индекса с включённым потоком данных.
PUT _index_template/my-data-stream-template { "index_patterns": [ "my-data-stream*" ], "data_stream": { }, "priority": 500 } -
Индексируйте документ с созданным вами конвейером.
POST my-data-stream/_doc?pipeline=my-pipeline { "message": "212.87.37.154 - - [05/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"" } -
Чтобы проверить, выполните поиск в потоке данных, чтобы получить документ. Следующий запрос использует
filter_pathдля возвращения только источника документа.GET my-data-stream/_search?filter_path=hits.hits._source
API возвращает:
{ "hits": { "hits": [ { "_source": { "@timestamp": "2099-05-05T16:21:15.000Z", "http": { "request": { "referrer": "\"-\"", "method": "GET" }, "response": { "status_code": 200, "body": { "bytes": 3638 } }, "version": "1.1" }, "source": { "ip": "212.87.37.154", "geo": { "continent_name": "Europe", "region_iso_code": "DE-BE", "city_name": "Berlin", "country_iso_code": "DE", "country_name": "Germany", "region_name": "Land Berlin", "location": { "lon": 13.4978, "lat": 52.411 } } }, "message": "212.87.37.154 - - [05/May/2099:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"", "url": { "original": "/favicon.ico" }, "user": { "name": "-", "id": "-" }, "user_agent": { "original": "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"", "os": { "name": "Mac OS X", "version": "10.11.6", "full": "Mac OS X 10.11.6" }, "name": "Chrome", "device": { "name": "Mac" }, "version": "52.0.2743.116" } } } ] } }
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/common-log-format-example.html