2017-10-20 1 views
1

Ich versuche, JSON-Zeichenfolgen zu Logstash und dann Kafka zu senden, aber ich erfahre JSON-Parse-Fehler aufgrund der doppelten Anführungszeichen in meiner JSON-Datei.Logstash-JSON-Eingabe mit Escape-Doppelzitat

Ich habe eine Reihe von verschiedenen Kombinationen der ersetzen versucht, aber nichts davon funktioniert. Ich bin mir nicht sicher, ob

  1. Der Fehler bereits in der Eingangsseite der Config auftritt, so ist es weiterhin nicht auf den Filterteil
  2. Ich bin gerade nicht die Saiten ersetzt richtig

ich erhalte eine json als:

{"message": "This is a \"string with quote"} 

Mein logstash conf ist:

input { 
    tcp { 
    codec => json { charset => "UTF-8" } 
    port => 10000 
    } 
} 

filter { 
    json { 
    source => "message" 
    } 
    mutate { 
    remove_field => ["@version", "@timestamp", "host", "port"] 
    gsub => [ 
     # replace all backslashes + double quote with space 
    'body', '\\"', ' ' 
    ] 
    } 
} 

output { 
    kafka { 
    bootstrap_servers => "localhost:9092" 
    codec => json {charset => "UTF-8"} 
    topic_id => 'logstash_logs' 
    } 

file { 
    path => "/usr/share/logstash/test.log" 
    codec => rubydebug 
    } 
} 

Mein rubydebug log ist:

{ 
    "message" => "{\"message\": \"This is a \"string with quote\"}", 
     "tags" => [ 
     [0] "_jsonparsefailure" 
    ] 
} 
+0

Was ist die vollständige Quellnachricht? –

+0

Die eigentliche Nachricht, die ich erhalte, sind Nachrichtenartikel von Premium-Nachrichtenquellen. Ein Auszug sieht so aus: {"an": "AFNWS00020150624eb6o0006h", "body": "Die Messe soll das Potential erneuerbarer Energien aufzeigen, ... \ n \ n \" Wir machen ländliche Gebiete elektrisierend, die lang sind Weg vom nationalen Netz \ ", sagte sie. \" Wir haben Solarpaneele priorisiert, um Elektrizität für soziale Infrastrukturen wie Schulen und Krankenhäuser zur Verfügung zu stellen \ ".} – Merelda

Antwort

0

Die _jsonparsefailure Diagnose ist hier, die mir sagt, dass es das json {} Filter war die fehlgeschlagen. Seit Logstash is using their own parsing gem, die the jrjackson gem verwendet, können Sie einige dieser Parsing testen, wenn Sie jruby praktisch haben.

JrJackson::Ruby.parse(data, options) 

rescue JrJackson::ParseError => e 
    raise LogStash::Json::ParserError.new(e.message) 
end 

dass das Segment des Code ist, dass Du Parse ist versagt, so ist dies wahrscheinlich ein Fehler in dem jrjackson Parser. Wenn Sie eine saubere Reproduktion erhalten können, consider reporting it as an issue on the gem. Wenn nicht, ist dies ein Kandidat für die Berichterstattung über the logstash-filter-json project's issue-tracker.

Um dies zu umgehen, müssen Sie die Protokollzeile vor dem Parsing "reparieren". Das ist eine knorrige Regex.