Почему Elasticsearch Ingest не принимает шаблон grok, который делает Logstash?

У меня есть следующий шаблон grok, который работает в Logstash и в отладчике Grok в Kibana.

\[%{TIMESTAMP_ISO8601:req_time}\] %{IP:client_ip} (?:%{IP:forwarded_for}|\(-\)) (?:%{QS:request}|-) %{NUMBER:response_code:int} %{WORD}:%{NUMBER:request_length:int} %{WORD}:%{NUMBER:body_bytes_sent:int} %{WORD}:(?:%{QS:http_referer}|-) %{WORD}:(?:%{QS:http_user_agent}|-) (%{WORD}:(\")?(%{NUMBER:request_time:float})(\")?)?"

Я пытаюсь создать новый конвейер загрузки с помощью метода PUT, но получаю сообщение об ошибке, содержащее:

    "type": "parse_exception",
    "reason": "Failed to parse content to map",
    "caused_by": {
        "type": "i_o_exception",
        "reason": "Unrecognized character escape '[' (code 91)\n at [Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@61326735; line: 7, column: 25]"
    } 

person Tony Laidig    schedule 25.07.2018    source источник


Ответы (1)


Elasticsearch требует, чтобы шаблоны grok, используемые в конвейерах, отправленных с использованием метода PUT, были правильно экранированы JSON, в то время как шаблоны Logstash используют другое экранирование.

Это включает предшествующие скобки с двойными обратными косыми чертами (\\[) и двойные кавычки с тройными обратными косыми чертами (\\\"). Рабочий шаблон (после запуска через инструмент экранирования JSON):

\\[%{TIMESTAMP_ISO8601:req_time}\\] %{IP:client_ip} (?:%{IP:forwarded_for}|\\(-\\)) (?:%{QS:request}|-) %{NUMBER:response_code:int} %{WORD}:%{NUMBER:request_length:int} %{WORD}:%{NUMBER:body_bytes_sent:int} %{WORD}:(?:%{QS:http_referer}|-) %{WORD}:(?:%{QS:http_user_agent}|-) (%{WORD}:(\\\")?(%{NUMBER:request_time:float})(\\\")?)?
person Tony Laidig    schedule 25.07.2018