2016-11-02 4 views
0

をfloatにJSON出力に科学的表記法を避け2.3.4Logstashに以下の構成を実行

は、次の出力につながる:私はへの変換を防ぐことができますどのように

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

json出力の科学記法ですか?

私はthis Logstash bugと対応していますが、すべての出力とコーデックはイベントクラスに入れられているので自動的に利益を得ると考えています。しかし、どちらかが間違っていたか、何かが欠けていたので、何かヒントをいただきました。

答えて

1

Logstashのバグ修正では、1000000000000000.0以上で、0.0001未満の値が修正されています。残念ながら "0.0007674"はどちらのカテゴリにも当てはまりません。小さい数字を設定すると、たとえば(0.00007674)それは期待どおりに動作します。

以下の解決策は、小さい値(0.00007674)が満足できるかどうか、または文字列として表示されるかどうかに関係なく、出力にfloat ...の文字列表現を作成することに注意してください。

文字列として表示されている場合は、単に突然変異を行わない方がよい場合があります。

sprintfメソッドを初期化子でオーバーライドすることができます。

アプリ/設定/初期化子/ 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

おかげで、これは興味深いアプローチのように見えます。もう少し調べてみると、問題は、すべての出力コーデックが独自に、このフォーマットをどのように処理するかを決めることができるようです。 JSONの場合、0.7E-4はRubydebugの場合と同様に絶対に有効な数値です。だから私たちのコードにそのバグ修正を含めるために私たちの(独自の)出力コーデックを修正する必要があるようです... –

関連する問題