Грок странная проблема - PullRequest
0 голосов
/ 18 апреля 2020

мы используем конвейер в Elasticsearch для имитации фильтра Грока. Мы встречаемся со следующим странным поведением:

, если поле метки времени находится в начале сообщения, фильтр grok не работает.

## GROK NOT WORK
    POST /_ingest/pipeline/_simulate
    {
      "pipeline": {
        "processors": [
          {
            "grok": {
              "field": "message",
              "patterns": ["""%{TIMESTAMP_ISO8601:@timestamp} %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} %{TIMESTAMP_ISO8601:@timestamp}"""]
            }
          }
        ]
      },
        "docs": [
        {
          "_source": {
            "message": "2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  "
          }
        }
      ]
    }

У нас есть следующая ошибка:

{
  "docs" : [
    {
      "error" : {
        "root_cause" : [
          {
            "type" : "illegal_argument_exception",
            "reason" : "Provided Grok expressions do not match field value: [2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  ]"
          }
        ],
        "type" : "illegal_argument_exception",
        "reason" : "Provided Grok expressions do not match field value: [2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  ]"
      }
    }
  ]
}

В этом формате отметка времени в конце сообщения, фильтр grok работает нормально.

    ## GROK WORKS FINE
    POST /_ingest/pipeline/_simulate
    {
      "pipeline": {
        "processors": [
          {
            "grok": {
              "field": "message",
              "patterns": ["""%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} %{TIMESTAMP_ISO8601:@timestamp}"""]
            }
          }
        ]
      },
        "docs": [
        {
          "_source": {
            "message": "55.3.244.1 GET /index.html 15824 0.043 2019-09-29T00:39:02.91ZZ"
          }
        }
      ]
    }

Заранее спасибо

1 Ответ

0 голосов
/ 18 апреля 2020

Это "ZZ" после времени, которое не совместимо с ISO.

Вы можете добавить. * -> "0 или более символов"

% {TIMESTAMP_ISO8601:@timestamp} . *

и * после последней метки времени, чтобы сделать ее необязательной

{
  "pipeline": {
    "processors": [
      {
        "grok": {
          "field": "message",
          "patterns": [
            "%{TIMESTAMP_ISO8601:@timestamp}.* %{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} %{TIMESTAMP_ISO8601:@timestamp}*"
          ]
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "message": "2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  "
      }
    }
  ]

Результат:

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : {
          "duration" : "0.043",
          "request" : "/index.html",
          "@timestamp" : "2019-09-29T00:39:02.91Z",
          "method" : "GET",
          "bytes" : "15824",
          "client" : "55.3.244.1",
          "message" : "2019-09-29T00:39:02.91ZZ 55.3.244.1 GET /index.html 15824 0.043  "
        },
        "_ingest" : {
          "timestamp" : "2020-04-18T10:43:39.8725873Z"
        }
      }
    }
  ]
}
...