【问题标题】:Unable to map the logstash with ElasticSearch on linux无法在 Linux 上使用 ElasticSearch 映射日志存储
【发布时间】:2019-08-23 06:04:18
【问题描述】:

无法在 Linux 上使用 ElasticSearch 映射 logstash

我只是运行下面的命令,它显示了 docker 上所有正在运行的图像

sudo docker ps

输出:

CONTAINER ID    IMAGE             COMMAND                   CREATED           STATUS           PORTS                    NAMES
e14ace6bd419    a962b6541416      "/bin/bash /usr/loca…"    23 hours ago      Up 22 hours      0.0.0.0:5601->5601/tcp   trusting_chatterjee
00e6822bb991    28259852697e      "/usr/local/bin/dock…"    23 hours ago      Up 23 hours      9200/tcp, 9300/tcp       friendly_roentgen

我只想将logstash链接到弹性搜索并尝试运行以下命令

命令:

 sudo docker run -d --rm -it -v /home/sabharanikumar/logstash.conf e95781358676

输出:

989e2a8f4d9fd972c4f2102d726a68877c989b546800899abbb8c382fb62f04c

logstash.conf:

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

Logstash 日志:

[2019-08-23T09:40:53,833][警告][logstash.outputs.elasticsearch] 尝试恢复与死掉的 ES 实例的连接,但得到了一个 错误。 {:url=>"http://logstash_system:xxxxxx@elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch 无法访问: [http://logstash_system:xxxxxx@elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch:名称或服务未知”}

我运行了 sudo docker ps,但正在列出 logstash。

有什么我错过的吗?有什么地方需要更改主机值吗?

【问题讨论】:

  • 您需要运行sudo docker ps -a,然后您将看到您的容器处于退出状态。运行docker logs <container_name> 并发布结果,如果您仍然需要帮助来解决问题,但很可能日志会告诉您确切的问题所在。
  • “localhost:9200”看起来也不对。此配置在容器内读取。对于该容器,本地主机是容器本身。我想你想指向friendly_roentgen。关于容器名称,我建议您在启动它们时给它们命名,而不是让 docker 每次启动容器时选择另一个随机名称。
  • 更新了最新发现。我刚刚更新了命令并观察到logstash 现在正在启动并运行。但它仍然会引发一些错误。

标签: docker elasticsearch logstash kibana


【解决方案1】:

正如@Mihai 在 cmets 中指出的那样,“localhost:9200”是不正确的。 logstash 容器将尝试在端口 9200 上与自己通信,但那里没有任何监听。

我看到的第二个问题是您将 logstash 配置文件作为参数(或命令)传递给 docker。此外,您应该避免使用 --link 选项,因为它已被弃用并且更喜欢网络生成。

换句话说,命令应该是这样的:

docker network create \
    --driver bridge \
    --subnet=172.100.0.0/16 \
    --gateway=172.100.0.1 \
    my_elk_net

然后使用 --network=my_elk_net 选项启动两个 docker 容器。例如

docker run -d \
    --name elasticsearch \
    --name my_elk_net \
    <ElasticSearchIMAGEID>

docker run -d \
    --name logstash \
    --network my_elk_net \
    -v "/home/arrchana/logstash.conf:/usr/share/logstash/config/logstash.yml:ro"
    <LogstashIMAGEID>

您的弹性搜索现在应该如下所示:

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

或者,您可以使用 docker-compose 并避免创建网络。 一个非常基本的 docker-compose.yml 示例,应该适合您,应该如下所示:

version: '3.7'

services:
  elasticsearch:
    image: image_image

  logstash:
    image: logstash_image
    volumes:
      - /home/arrchana/logstash.conf:/usr/share/logstash/config/logstash.yml:ro
    depends_on:
     - elasticsearch

【讨论】:

  • 这让生活变得轻松......谢谢你
  • 没问题,我担心在当前的设置下你会面临一些其他关于 docker 中的 stdin {} 的问题,但我完全不确定。
猜你喜欢
  • 2018-07-18
  • 2019-09-02
  • 2014-05-03
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多