2016-06-12 17 views
1

Ich habe mehrere Systeme, die Daten als JSON Request Body senden. Das ist meine einfache Konfigurationsdatei.Logstash escape JSON Keys

input { 
    http { 
    port => 5001 
    } 
} 

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

In den meisten Fällen funktioniert das gut. Ich kann die JSON-Daten mit Kibana betrachten. In einigen Fällen wird der JSON nicht verarbeitet. Es hat etwas damit zu tun, dass JSON entkommen konnte. Zum Beispiel: Wenn ein Schlüssel ein '.' Enthält, wird der JSON nicht verarbeitet.

Ich kann den JSON nicht steuern. Gibt es eine Möglichkeit, diesen Zeichen in einem JSON-Schlüssel zu entkommen?

Update: (... Der Inhalt wird geändert Aber ich habe den JSON String getestet es das gleiche Verhalten wie das Original hat) Wie in den Kommentaren erwähnt werde ich ein Beispiel für einen JSON String geben:

{ 
    "http://example.com": { 
    "a": "", 
    "b": "" 
    } 
} 
+1

Vielleicht sollten Sie eine Probe JSON Sie erhalten zeigen. – Val

Antwort

1

Meine Forschung bringt mich endlich zu meinem Beitrag zurück.

Vor Elasticsearch 2.0 waren Punkte im Schlüssel erlaubt. Seit Version 2.0 ist dies nicht mehr der Fall. Ein Benutzer im logstash Forum entwickelte ein Ruby-Skript, das sich um die Punkte in json Schlüssel nimmt:

filter { 
    ruby { 
    init => " 
     def remove_dots hash 
      new = Hash.new 
      hash.each { |k,v| 
       if v.is_a? Hash 
        v = remove_dots(v) 
       end 
       new[ k.gsub('.','_') ] = v 
       if v.is_a? Array 
        v.each { |elem| 
         if elem.is_a? Hash 
          elem = remove_dots(elem) 
         end 
         new[ k.gsub('.','_') ] = elem 
        } unless v.nil? 
       end 
      } unless hash.nil? 
      return new 
     end 
    " 
    code => " 
     event.instance_variable_set(:@data,remove_dots(event.to_hash)) 
    " 
    } 
} 

Alle Credits gehen an @ hanzmeier1234 (Field name cannot contain ‘.’)