Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Конвейеры обработки данных

Пример: Парсинг логов в формате 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 для более быстрых поисков и визуализации. Вы также хотите знать, откуда поступает запрос.

  1. В Kibana откройте главное меню и нажмите Управление стеком > Конвейеры обработки данных.

    Kibana’s Ingest Pipelines list view
  2. Нажмите Создать конвейер.
  3. Укажите имя и описание для конвейера.
  4. Добавьте процессор Grok для парсинга сообщения лога:

    1. Нажмите Добавить процессор и выберите тип процессора Grok.
    2. Установите Поле на 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}
    3. Нажмите Добавить, чтобы сохранить процессор.
    4. Установите описание процессора на Extract fields from 'message'.
  5. Добавьте процессоры для полей временной метки, IP-адреса и пользовательского агента. Настройте процессоры следующим образом:

    Тип процессора Поле Дополнительные параметры Описание

    Дата

    @timestamp

    Форматы: dd/MMM/yyyy:HH:mm:ss Z

    Format '@timestamp' as 'dd/MMM/yyyy:HH:mm:ss Z'

    GeoIP

    source.ip

    Целевое поле: source.geo

    Add 'source.geo' GeoIP data for 'source.ip'

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

    user_agent

    Extract fields from 'user_agent'

    Ваша форма должна выглядеть примерно так:

    Processors for Ingest Pipelines

    Четыре процессора будут выполняться последовательно:
    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"
          }
        }
      ]
    
    }
  6. Чтобы протестировать конвейер, нажмите Добавить документы.
  7. На вкладке Документы укажите пример документа для тестирования:

    [
      {
        "_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\""
        }
      }
    ]
  8. Нажмите Запустить конвейер и проверьте, что конвейер работал как ожидалось.
  9. Если все выглядит правильно, закройте панель, а затем нажмите Создать конвейер.

    Теперь вы готовы индексировать данные логов в поток данных.

  10. Создайте шаблон индекса с включённым потоком данных.

    PUT _index_template/my-data-stream-template
    {
      "index_patterns": [ "my-data-stream*" ],
      "data_stream": { },
      "priority": 500
    }
  11. Индексируйте документ с созданным вами конвейером.

    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\""
    }
  12. Чтобы проверить, выполните поиск в потоке данных, чтобы получить документ. Следующий запрос использует 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API