Docker Logstash配置自定义ES地址后仍连接默认地址的原因
问题:Logstash配置自定义Elasticsearch地址后仍尝试连接默认地址
我的Logstash配置(Docker环境)
input { tcp { port => 5000 } } output { elasticsearch { hosts => ["https://my-custom-elastic.com:9321"] } }
预期行为
Logstash应仅连接至自定义地址https://my-custom-elastic.com:9321,而非默认的http://elasticsearch:9200/。
实际情况
每次启动都会出现如下错误日志:
[2023-08-18T06:11:35,099][INFO ][logstash.licensechecker.licensereader] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://elasticsearch:9200/]}} [2023-08-18T06:11:35,409][INFO ][logstash.licensechecker.licensereader] Failed to perform request {:message=>"elasticsearch: Name or service not known", :exception=>Manticore::ResolutionFailure, :cause=>java.net.UnknownHostException: elasticsearch: Name or service not known} [2023-08-18T06:11:35,415][WARN ][logstash.licensechecker.licensereader] Attempted to resurrect connection to dead ES instance, but got an error {:url=>"http://elasticsearch:9200/", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :message=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch: Name or service not known"} [2023-08-18T06:11:35,599][INFO ][logstash.licensechecker.licensereader] Failed to perform request {:message=>"elasticsearch", :exception=>Manticore::ResolutionFailure, :cause=>java.net.UnknownHostException: elasticsearch}
我确认Logstash已加载正确配置,因为报错后不久它确实能连接到预期的自定义地址。请问为何配置了自定义主机后仍尝试连接默认地址?
解决方案
原因分析
错误日志中的logstash.licensechecker.licensereader是Logstash内置的许可证读取器组件(属于X-Pack模块,默认启用),它的作用是连接Elasticsearch获取许可证信息,和你在output块中配置的ES地址相互独立。该组件默认使用http://elasticsearch:9200作为连接地址,因此即使你配置了输出的自定义ES地址,它仍会尝试访问默认地址。
你看到后续Logstash能连接到自定义地址,是因为output插件的连接逻辑正常工作,许可证检查的报错只是组件自身的失败,不会影响日志的正常传输,但会产生冗余错误日志。
解决办法
方法1:指定许可证检查的ES地址
在Logstash的主配置文件logstash.yml中添加以下配置,将许可证读取器指向你的自定义ES地址:
xpack.license.elasticsearch.hosts: ["https://my-custom-elastic.com:9321"] # 若ES开启了认证,需补充用户名和密码 xpack.license.elasticsearch.username: "你的用户名" xpack.license.elasticsearch.password: "你的密码"
如果是Docker部署,可以通过环境变量传递配置:
docker run -d \ -v /path/to/your/logstash/config:/usr/share/logstash/config \ -e XPACK_LICENSE_ELASTICSEARCH_HOSTS=https://my-custom-elastic.com:9321 \ -e XPACK_LICENSE_ELASTICSEARCH_USERNAME=你的用户名 \ -e XPACK_LICENSE_ELASTICSEARCH_PASSWORD=你的密码 \ docker.elastic.co/logstash/logstash:8.x
方法2:禁用许可证检查(适合测试或无X-Pack需求场景)
如果不需要X-Pack的许可证功能,可以直接禁用该组件:
在logstash.yml中添加:
xpack.license.enabled: false
Docker部署时通过环境变量设置:
docker run -d \ -v /path/to/your/logstash/config:/usr/share/logstash/config \ -e XPACK_LICENSE_ENABLED=false \ docker.elastic.co/logstash/logstash:8.x
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

