Logstash: обработка больших сообщений

Я пытаюсь проанализировать большое сообщение с помощью Logstash, используя ввод файла, фильтр json и вывод elasticsearch. В 99% случаев это работает нормально, но когда одно из моих сообщений журнала слишком велико, я получаю ошибки синтаксического анализа JSON, поскольку исходное сообщение разбивается на два частичных недопустимых потока JSON. Размер таких сообщений составляет около 40 000+ символов. Я посмотрел, есть ли какая-либо информация о размере буфера или какой-то максимальной длине, которую я должен попытаться удержать, но мне не повезло. Единственные ответы, которые я нашел, связаны с вводом udp и возможностью изменения размера буфера.

Имеет ли Logstash предельный размер для каждого сообщения о событии? https://github.com/elastic/logstash/issues/1505

Это также может быть похоже на этот вопрос, но никогда не было ответов или предложений: Фильтр Logstash Json неожиданно ведет себя для больших вложенных JSON

В качестве обходного пути я хотел разделить свое сообщение на несколько сообщений, но я не могу этого сделать, так как мне нужно, чтобы вся информация находилась в одной записи в Elasticsearch. Я не верю, что есть способ вызвать Update API из logstash. Кроме того, большая часть данных находится в массиве, поэтому, хотя я могу обновить массив записей Elasticsearch с помощью скрипта (Elasticsearch вставляет и добавляет к массиву), я не могу сделать это из Logstash.

Записи данных выглядят примерно так:

{ "variable1":"value1", 
 ......, 
 "variable30": "value30", 
 "attachements": [ {5500 charcters of JSON}, 
                   {5500 charcters of JSON}, 
                   {5500 charcters of JSON}.. 
                   ...
                   {8th dictionary of JSON}]
 }

Кто-нибудь знает, как заставить Logstash обрабатывать эти большие сообщения JSON или как я могу разделить их и поместить в одну и ту же запись Elasticsearch (используя Logstash)?

Любая помощь приветствуется, и я рад добавить любую необходимую информацию!


person praddc    schedule 01.05.2015    source источник


Ответы (1)


Если ваш вывод elasticsearch имеет набор document_id, он обновит документ (действие по умолчанию в logstash — index данные, которые обновят документ, если он уже существует)

В вашем случае вам нужно будет включить какое-то уникальное поле как часть ваших сообщений json, а затем полагаться на это, чтобы выполнить слияние в elasticsearch. Например:

{"key":"123455","attachment1":"something big"}
{"key":"123455","attachment2":"something big"}
{"key":"123455","attachment3":"something big"}

И затем получите вывод elasticsearch, например:

elasticsearch { 
  host => localhost
  document_id => "%{key}" 
}
person Alcanzar    schedule 04.05.2015