2016-07-19 10 views
2

Ich habe eine Protokolldatei, die ein Array von Objekten ist, die etwa wie folgt aussieht:Parsing eine Reihe von JSON-Objekten in Logstash

[ 
    { "cate1": "data1a", "cate2": "data2a" }, 
    { "cate1": "data1b", "cate2": "data2b" }, 
    { "cate1": "data1c", "cate2": "data2c" } 
] 

und ich brauche jedes Objekt im Array ein eigener Eintrag in Elasticsearch zu sein und Jedes "Cate" ist ein Feld. Meine aktuelle logstash.conf Datei ist:

input { 
    tcp { 
    port => 5000 
    } 
} 

## Add your filters/logstash plugins configuration here 

filter { 
    json { 
    source => "message" 
    target => "event" 
    } 
    mutate { 
    gsub => ["message","\]",""] 
    gsub => ["message","\[",""] 
    } 
} 

output { 
    elasticsearch { 
    hosts => "elasticsearch:9200" 
    } 
} 

aber es Tags jede Zeile mit „_jsonparsefailure“ außer dem ersten Eintrag und es analysiert die quadratischen als auch Klammern. Wie würde ich Logstash konfigurieren, um dies richtig zu machen?

+0

Bitte zeigen Sie uns, was die Ausgabe aussieht, als auch, was Ihre config/Ausgabe waren, wenn Sie den json Codec –

Antwort

1

Anstatt den Filter json zu verwenden, sollten Sie den Eingang json codec verwenden. Es scheint genau das zu tun, was Sie wollen:

Dieser Codec verwendet werden können (über die Eingänge) zu dekodieren und kodieren (über Ausgänge) voll JSON-Nachrichten. Wenn die gesendeten Daten ein JSON-Array im Stammverzeichnis sind, werden mehrere Ereignisse erstellt (eins pro Element).

Es würde wie folgt aussehen:

input { 
    tcp { 
    port => 5000 
    codec => json{ } 
    } 
} 
+0

versucht Dies erzeugt das gleiche falsche Ergebnis . –