这个错误表明 Logstash 配置文件中引用了 ${xpack.monitoring.elasticsearch.hosts} 变量,而该变量既未在环境变量中定义,也未在 Logstash 的 secrets 存储中配置,同时也没有提供默认值。


解决问题的步骤

1. 理解问题来源

  • ${xpack.monitoring.elasticsearch.hosts} 是一个占位符,通常用于配置 Logstash 监控功能。
  • 如果未正确定义该变量,Logstash 会尝试从以下来源查找:
    1. 环境变量
    2. Logstash Secrets Store
    3. 配置文件中明确的值
  • 如果以上任一来源未提供值,则会触发此错误。

2. 解决方案

方法 1:设置环境变量

在 Docker Compose 文件中,添加环境变量 XPACK_MONITORING_ELASTICSEARCH_HOSTS,并指向 Elasticsearch 的地址。

修改 docker-compose.yml

yaml
logstash: image: docker.elastic.co/logstash/logstash:8.6.0 environment: - LOGSTASH_JAVA_OPTS=-Xms256m -Xmx256m - XPACK_MONITORING_ELASTICSEARCH_HOSTS=https://elasticsearch:9200 - XPACK_MONITORING_ELASTICSEARCH_USERNAME=elastic - XPACK_MONITORING_ELASTICSEARCH_PASSWORD=your_password volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf - ./certs:/usr/share/logstash/config/certs depends_on: - elasticsearch
  • 环境变量解释
    • XPACK_MONITORING_ELASTICSEARCH_HOSTS: 设置用于监控的 Elasticsearch 地址。
    • XPACK_MONITORING_ELASTICSEARCH_USERNAME: Elasticsearch 的用户名。
    • XPACK_MONITORING_ELASTICSEARCH_PASSWORD: Elasticsearch 的密码。

方法 2:直接在 logstash.yml 配置文件中设置默认值

如果不使用环境变量,可以直接在 logstash.yml 中定义监控配置。

编辑 logstash.yml 文件:

yaml
xpack.monitoring.elasticsearch.hosts: ["https://elasticsearch:9200"] xpack.monitoring.elasticsearch.username: "elastic" xpack.monitoring.elasticsearch.password: "your_password" xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/share/logstash/config/certs/ca.crt"

然后将 logstash.yml 文件挂载到容器:

yaml
logstash: image: docker.elastic.co/logstash/logstash:8.6.0 volumes: - ./logstash.yml:/usr/share/logstash/config/logstash.yml - ./certs:/usr/share/logstash/config/certs depends_on: - elasticsearch

方法 3:禁用 X-Pack 监控

如果不需要启用 X-Pack 监控,可以直接禁用它。

修改 logstash.yml

yaml
xpack.monitoring.enabled: false

或者在 Docker Compose 中添加环境变量:

yaml
logstash: environment: - XPACK_MONITORING_ENABLED=false

方法 4:定义默认值

如果需要更灵活的配置方式,可以在使用占位符的同时提供默认值。例如:

yaml
xpack.monitoring.elasticsearch.hosts: "${XPACK_MONITORING_ELASTICSEARCH_HOSTS:https://elasticsearch:9200}"

这种方式表示:

  • 如果环境变量 XPACK_MONITORING_ELASTICSEARCH_HOSTS 存在,则使用其值。
  • 否则,使用默认值 https://elasticsearch:9200

3. 检查日志和验证配置

检查日志

查看 Logstash 容器日志,确认是否还有错误:

bash
docker logs logstash

验证配置是否生效

  1. 检查是否启用了 X-Pack 监控:

    bash
    curl -X GET "http://<elasticsearch-host>:9200/_cat/indices?v" -u elastic:your_password

    应该看到类似 .monitoring-logstash-* 的索引。

  2. 如果禁用了 X-Pack 监控,确保 Logstash 正常运行。


总结

  1. 如果需要启用监控:
    • logstash.yml 或环境变量中正确配置 xpack.monitoring.elasticsearch.*
  2. 如果不需要监控:
    • 在配置中禁用 xpack.monitoring.enabled
  3. 检查环境变量或配置文件是否正确加载,并确保挂载到容器的路径无误。

通过这些步骤,你可以解决 Logstash 容器的 ${xpack.monitoring.elasticsearch.hosts} 未定义问题。

点赞(368) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部