masalah logstash dengan file input json

saya memiliki json berikut dalam file-

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

dan file conf berikut-

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

tapi saat aku berlari

./logstash -f sample.conf

saya tidak mendapatkan output apa pun di stdout.

tetapi ketika saya tidak memberikan json sebagai codec dan memberikan type => "core2" maka sepertinya itu berhasil. Adakah yang tahu bagaimana saya bisa memperbaikinya agar berfungsi untuk tipe json.

Masalah lainnya adalah ini memberi saya output berikut ketika memberikan 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"}

Saya ingin tahu bagaimana cara menguraikannya dengan benar dengan pasangan nilai kunci di file input saya


person sharat    schedule 15.07.2015    source sumber


Jawaban (2)


Saya menemukan ini dan mengeditnya agar sesuai dengan tujuan Anda. Konfigurasi berikut harus melakukan apa yang Anda inginkan:

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 }
}
}

Saya mencoba json yang Anda berikan dan menghasilkan dua peristiwa. Pertama dengan foo = bar dan spam = eggs. Kedua dengan css = ddq dan eeqw = fewq.

person hurb    schedule 15.07.2015
comment
saya bekerja sebagian. Tapi saya hanya bisa membaca data json pertama dan bukan data kedua (dengan css). Apakah ada sesuatu yang hilang? - person sharat; 17.07.2015
comment
Mungkin ada baris baru yang hilang di akhir file json Anda. Logstash tidak akan membaca baris terakhir sampai selesai dengan baris baru. - person hurb; 17.07.2015
comment
ok. Misalkan saya tidak memiliki pemisah koma. bagaimana tampilan filternya? saya mencoba gsub =› [ pesan,},] tetapi tidak berhasil - person sharat; 20.07.2015
comment
Coba ini sebagai gsub kedua: gsub => [ "message","}{","{"] Ini akan membaca data Anda dengan benar tanpa pemisah koma. - person hurb; 20.07.2015

Sejauh pemahaman saya, Anda ingin meletakkan dokumen lengkap anak Anda dalam satu baris jika Anda ingin menggunakan codec json_lines:

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

Dalam kasus Anda, Anda memiliki masalah dengan struktur karena Anda juga memiliki ',' di antara objek anak. Bukan cara termudah untuk menanganinya. JADI jika memungkinkan ubah sumbernya ke contoh saya. Jika hal ini tidak memungkinkan, pendekatan multiline mungkin dapat membantu Anda. Periksa ini untuk referensi: masukkan json ke logstash - masalah konfigurasi?

person Jettro Coenradie    schedule 15.07.2015
comment
Faktanya, mengubah sumber mungkin merupakan sebuah pendekatan. Namun, jika tidak memungkinkan, lihat jawaban saya. - person hurb; 15.07.2015