проблема logstash с входным файлом json

у меня есть следующий json в файле-

{
"foo":"bar",
"spam" : "eggs"
},
{
"css":"ddq",
"eeqw": "fewq"
}

и следующий файл conf-

input { 
file
{ 
   path => "/opt/logstash-1.4.2/bin/sam.json"
   type => "json"
   codec => json_lines
   start_position =>"beginning"
 }
}
output { stdout {  codec => json  } }

но когда я бегу

./logstash -f sample.conf

я не получаю никакого вывода в stdout.

но когда я не даю json в качестве кодека и даю тип => «core2», тогда это работает. Кто-нибудь знает, как я могу исправить это, чтобы он работал для типа json.

Другая проблема заключается в том, что он дает мне следующий вывод, когда он выдает stdout-

{"message":"{","@version":"1","@timestamp":"2015-07-15T02:02:02.653Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"\"foo\":\"bar\", ","@version":"1","@timestamp":"2015-07-15T02:02:02.654Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"\"spam\" : \"eggs\" ","@version":"1","@timestamp":"2015-07-15T02:02:02.655Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"},","@version":"1","@timestamp":"2015-07-15T02:02:02.655Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"{ ","@version":"1","@timestamp":"2015-07-15T02:02:02.655Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"\"css\":\"ddq\", ","@version":"1","@timestamp":"2015-07-15T02:02:02.656Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"\"eeqw\": \"fewq\"","@version":"1","@timestamp":"2015-07-15T02:02:02.656Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"}","@version":"1","@timestamp":"2015-07-15T02:02:02.656Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}{"message":"","@version":"1","@timestamp":"2015-07-15T02:02:02.656Z","type":"core2","host":"sjagannath","path":"/opt/logstash-1.4.2/bin/sam.json"}

Я хочу знать, как его можно правильно проанализировать с помощью пар ключ-значение в моем входном файле.


person sharat    schedule 15.07.2015    source источник


Ответы (2)


Я нашел это и отредактировал его в соответствии с вашими целями. Следующая конфигурация должна делать именно то, что вы хотите:

input {   
file     {
    codec => multiline
    {
        pattern => "^\}"
        negate => true
        what => previous               
    }
    path => ["/absoute_path/json.json"]
    start_position => "beginning"
    sincedb_path => "/dev/null"
}
}

filter {
mutate    {
    replace => [ "message", "%{message}}" ]
    gsub => [ "message","\n",""]
    gsub => [ "message","},",""]
}
if [message] =~ /^{.*}$/     {
    json { source => message }
}
}

Я попробовал ваш данный json, и это приводит к двум событиям. Сначала с foo = bar и spam = eggs. Второй с css = ddq и eeqw = fewq.

person hurb    schedule 15.07.2015
comment
работаю частично. Но я могу прочитать только первые данные json, а не вторые (с css). Чего-то не хватает? - person sharat; 17.07.2015
comment
Возможно, отсутствует новая строка в конце вашего json-файла. Logstash не будет читать последнюю строку, пока она не закончится новой строкой. - person hurb; 17.07.2015
comment
хорошо. Предположим, у меня нет разделителя запятой. как должен выглядеть фильтр? я попробовал gsub =› [сообщение,},], но это не сработало - person sharat; 20.07.2015
comment
Попробуйте это как второй gsub: gsub => [ "message","}{","{"] Он должен правильно читать ваши данные без разделителя запятой. - person hurb; 20.07.2015

Насколько я понимаю, вы хотите поместить свой полный сыновний документ в одну строку, если хотите использовать кодек json_lines:

{"foo":"bar","spam" : "eggs"}
{"css":"ddq","eeqw": "fewq"}

В вашем случае у вас есть проблема со структурой, так как у вас также есть «,» между объектами сына. Не самый простой способ справиться с этим. SO, если возможно, измените источник на мой пример. Если это невозможно, вам может помочь многострочный подход. Проверьте это для справки: введите json в logstash - проблемы с конфигурацией?

person Jettro Coenradie    schedule 15.07.2015
comment
На самом деле изменение источника может быть подходом. Однако, если это невозможно, см. мой ответ. - person hurb; 15.07.2015