2016-12-24 10 views
0

私は以下のルビーハッシュを持っています。ruby​​ハッシュをlogstash設定ファイルにマップする

config = { 
    'output' => { 
    'elasticsearch' => { 
     'hosts' => ['localhost:9200'] 
    } 
    } 
} 

Logstash設定ファイル(https://www.elastic.co/guide/en/logstash/current/configuration.html)として表現しようとしています。この場合、これに似たものがあります。

output { 
    elasticsearch { hosts => ["localhost:9200"] } 
} 

私は近いマップを使用してみましたが、「elasticsearchは」「elasticsearch」と「ホスト」が引用されてはならない「=>」持っているべきではありません。

puts config.map{|k, v| "#{k} #{v}"}.join('&') 

output {"elasticsearch"=>{"hosts"=>["localhost:9200"]}} 

私はまた、JSONに変換しGSUBを使用して試してみたが、この場合には、私は、文字列と「出力」と「elasticsearchは」クォートするべきではないインデント解除する必要があります。

puts JSON.pretty_generate(config).gsub(/^[{}]$/, "") 
           .gsub(": {", " {") 
           .gsub(": ", " => ")[1..-2] 

    "output" { 
    "elasticsearch" { 
     "hosts" => [ 
     "localhost:9200" 
     ] 
    } 
    } 

各実装は近いうちに少しずれていますが、これを達成する簡単な方法はありますか?

答えて

1

Logstash設定形式は、標準のJSONなどではありません。シリアライザを書くだけの方がいいかもしれません。出力を出すと

def serialize_config(config, tabs = 0) 
    clauses = [] 
    config.each do |key, val| 
    case val 
    when Hash 
     clauses << format("%s {\n%s%s}", key, serialize_config(val, tabs + 1), "\t" * tabs) 
    else 
     clauses << format("%s => %s", key, val.inspect) 
    end 
    end 
    clauses.map {|c| format("%s%s\n", "\t" * tabs, c) }.join 
end 

config = { 
    'output' => { 
    'elasticsearch' => { 
     'hosts' => ['localhost:9200'] 
    }, 
    'ruby' => { 
     "code" => "event.cancel if rand <= 0.90" 
    } 
    } 
} 

puts serialize_config(config) 

output { 
     elasticsearch { 
       hosts => ["localhost:9200"] 
     } 
     ruby { 
       code => "event.cancel if rand <= 0.90" 
     } 
} 

あなたはしかし、より複雑なLogstashのコンフィグに対してそれをチェックしたいと思い、私はそれで簡単に刺しました。

+0

はいこれがトリックでした!本当にありがとう。 –

関連する問題