2016-12-24 20 views
0

我有以下红宝石哈希值。地图红宝石哈希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 CONFIGS,虽然。

+0

是的,这是诀窍!非常感谢。 –