2016-11-02 3 views
0

Lauf der folgende Konfiguration in Logstash 2.3.4Vermeiden wissenschaftliche Schreibweise in JSON ausgegeben wird, wenn Feld Umwandlung zu schweben

führt zu folgenden Ausgabe:

{"value":7.674E-4,"@version":"1","@timestamp":"2016-11-02T15:33:54.741Z","host":"myHost","sequence":0} 
{"value":7.674E-4,"@version":"1","@timestamp":"2016-11-02T15:33:54.741Z","host":"myHost","sequence":0} 

Wie kann ich die Umwandlung verhindern wissenschaftliche Notation in der JSON-Ausgabe?

Ich habe gefunden this Logstash bug mit der entsprechenden Lösung und dachte, dass alle Ausgänge und Codecs automatisch davon profitieren, da es in der Ereignisklasse gesetzt wurde. Aber entweder habe ich mich geirrt oder ich vermisse etwas, also wird jeder Hinweis geschätzt.

Antwort

1

Der Logstash-Bugfix behebt Werte, die größer oder gleich 1000000000000000.0 und kleiner als 0,0001 sind. Leider passt "0,0007674" nicht in beide Kategorien. Sie sollten sehen, dass wenn Sie eine kleinere Zahl, z. (0.00007674) dann funktioniert es wie erwartet.

Beachten Sie, dass die folgende Lösung eine Zeichenfolgendarstellung des Floats erstellt ... überprüfen Sie in Ihrer Ausgabe, ob der kleinere Wert (0.00007674) zufriedenstellend ist oder unabhängig davon als String angezeigt wird.

Wenn es trotzdem als String angezeigt wird, ist es vielleicht besser, die Mutation einfach nicht auszuführen.

Sie können die Methode sprintf in einem Initialisierer überschreiben.

app/config/initializers/fix_sprintf.rb

class LogStash::Event 

    alias_method :old_sprintf, :sprintf 

    public 
    def sprintf(format) 
    unchanged_format = format 
    if format.is_a?(Float) and format.to_s.include?('E') 
     format = ("%.15f" % format).sub(/0*$/,"") 
    else 
     format = format.to_s 
    end 
    if format.index("%").nil? 
     return format 
    end 

    old_sprintf(unchanged_format) 
    end 
end 
+0

Danke, das sieht aus wie ein interessanter Ansatz. Nach einigen weiteren Untersuchungen scheint das Problem zu sein, dass jeder Ausgabe-Codec selbst entscheiden kann, wie er mit dieser Formatierung umgehen soll. Für JSON ist 0.7E-4 eine absolut gültige Nummer, ebenso wie für Rubydebug. Es scheint also, als müssten wir unseren (eigenen) Ausgabe-Codec modifizieren, um diesen Bugfix in unseren Code aufzunehmen ... –

Verwandte Themen