Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Пайплайны обработки данных

Пример: Парсинг логов в формате Common Log Format

В этом примере вы научитесь использовать пайплайн обработки данных для парсинга серверных логов в формате Common Log Format перед индексированием. Перед началом работы проверьте предварительные условия для пайплайнов обработки данных.

Логи, которые вы хотите обработать, выглядят примерно так:

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"

Эти логи содержат временную метку, IP-адрес и пользовательский агент. Вы хотите, чтобы эти три элемента имели свои собственные поля в Elasticsearch для более быстрых поисков и визуализаций. Вы также хотите знать, откуда поступает запрос.

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

    Kibana’s Ingest Pipelines list view
  2. Нажмите Создать пайплайн > Новый пайплайн.
  3. Установите Имя на my-pipeline и, при необходимости, добавьте описание для пайплайна.
  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. Создайте шаблон индекса с включенным потоком данных.

    resp = client.indices.put_index_template(
        name="my-data-stream-template",
        index_patterns=[
            "my-data-stream*"
        ],
        data_stream={},
        priority=500,
    )
    print(resp)
    const response = await client.indices.putIndexTemplate({
      name: "my-data-stream-template",
      index_patterns: ["my-data-stream*"],
      data_stream: {},
      priority: 500,
    });
    console.log(response);
    PUT _index_template/my-data-stream-template
    {
      "index_patterns": [ "my-data-stream*" ],
      "data_stream": { },
      "priority": 500
    }
  11. Индексируйте документ с помощью созданного вами пайплайна.

    resp = client.index(
        index="my-data-stream",
        pipeline="my-pipeline",
        document={
            "message": "89.160.20.128 - - [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\""
        },
    )
    print(resp)
    const response = await client.index({
      index: "my-data-stream",
      pipeline: "my-pipeline",
      document: {
        message:
          '89.160.20.128 - - [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"',
      },
    });
    console.log(response);
    POST my-data-stream/_doc?pipeline=my-pipeline
    {
      "message": "89.160.20.128 - - [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">filter_path, чтобы вернуть только источник документа.

    resp = client.search(
        index="my-data-stream",
        filter_path="hits.hits._source",
    )
    print(resp)
    response = client.search(
      index: 'my-data-stream',
      filter_path: 'hits.hits._source'
    )
    puts response
    const response = await client.search({
      index: "my-data-stream",
      filter_path: "hits.hits._source",
    });
    console.log(response);
    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": "89.160.20.128",
                "geo": {
                  "continent_name" : "Europe",
                  "country_name" : "Sweden",
                  "country_iso_code" : "SE",
                  "city_name" : "Linköping",
                  "region_iso_code" : "SE-E",
                  "region_name" : "Östergötland County",
                  "location" : {
                    "lon" : 15.6167,
                    "lat" : 58.4167
                  }
                }
              },
              "message": "89.160.20.128 - - [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/8.17/common-log-format-example.html

Spec-Zone.ru

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