Logstash结合Elastic Cloud的cloud.id配置文档存在缺失问题
我碰到过好几个开发者踩这个坑——当你已经在logstash.yml里配置了cloud.id和cloud.auth,确实不用手动写ES实例的URL,但直接写空的elasticsearch { }块肯定不行,这会让Logstash默认去连本地的127.0.0.1:9200,也就是你看到的这个报错:
[WARN ][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>"http://127.0.0.1:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://127.0.0.1:9200/]
正确的两种配置方式:
方式1:在output块里显式引用全局配置变量
你需要在*.conf的output段里,明确告诉elasticsearch插件使用logstash.yml里的cloud配置,直接引用变量就行:
output { elasticsearch { cloud_id => "${cloud.id}" cloud_auth => "${cloud.auth}" # 这里可以加你的其他配置,比如自定义index:index => "my-logs-%{+YYYY.MM.dd}" } }
方式2:在logstash.yml里设置elasticsearch输出的默认配置
如果你不想在每个conf文件里重复写cloud参数,可以在logstash.yml里给output.elasticsearch设置全局默认值:
output.elasticsearch: cloud_id: "${cloud.id}" cloud_auth: "${cloud.auth}"
这样之后,你的conf文件里只需要写最简单的output块,插件会自动读取默认配置,不会再连localhost了:
output { elasticsearch { } }
为什么之前的配置不行?
Logstash的elasticsearch输出插件不会自动读取logstash.yml里的全局cloud.id和cloud.auth,必须要么在output块里显式声明,要么通过output.elasticsearch前缀的全局配置来指定默认值。空的elasticsearch { }块会触发插件的默认行为,也就是连接本地ES实例。
内容的提问来源于stack exchange,提问作者Walker Rowe

