如何解决常见的ELK堆栈问题

来自菜鸟教程
跳转至:导航、​搜索

介绍

本教程是 ELK Stack(Elasticsearch、Logstash、Kibana)故障排除指南。 它假定您遵循 如何在 Ubuntu 14.04 上安装 Elasticsearch、Logstash 和 Kibana(ELK 堆栈)教程,但它可能对其他常规 ELK 设置的故障排除有用。

本教程结构为一系列常见问题和这些问题的潜在解决方案,以及帮助您验证 ELK 堆栈的各个组件是否正常运行的步骤。 因此,请随意跳到与您遇到的问题相关的部分。

问题:Kibana 没有默认索引模式警告

通过 Web 浏览器访问 Kibana 时,您可能会遇到带有以下警告的页面:

Kibana warning:Warning No default index pattern. You must select or create one to continue.
...
Unable to fetch mapping. Do you have indices matching the pattern?

这是警告的屏幕截图:

“无法获取映射”表示 Elasticsearch 不包含与默认 logstash-* 模式匹配的任何条目。 通常,这意味着您的日志没有存储在 Elasticsearch 中,因为从 Logstash 到 Elasticsearch 和/或来自您的日志发送者(例如 Filebeat)到 Logstash。 换句话说,由于某种原因,您的日志没有通过从 Filebeat 到 Logstash 到 Elasticsearch 的链。

要解决 Logstash 和 Elasticsearch 之间的通信问题,请运行 Logstash 故障排除 部分。 要解决 Filebeat 和 Logstash 之间的通信问题,请运行 Filebeat 故障排除 部分。

如果您将 Logstash 配置为使用非默认索引模式,则可以通过在文本框中指定正确的索引模式来解决问题。

问题:Kibana 无法连接到 Elasticsearch

通过网络浏览器访问 Kibana 时,您可能会遇到出现此错误的页面:

Kibana error:Fatal Error
Kibana: Unable to connect to Elasticsearch

Error: Unable to connect to Elasticsearch
Error: Bad Gateway
...

这是错误的屏幕截图:

这意味着 Kibana 无法连接到 Elasticsearch。 Elasticsearch 可能没有运行,或者 Kibana 可能被配置为在错误的主机和端口上查找 Elasticsearch。

要解决此问题,请按照 Elasticsearch 故障排除部分确保 Elasticsearch 正在运行。 然后确保将 Kibana 配置为连接到运行 Elasticsearch 的主机和端口。

例如,如果 Elasticsearch 在端口 9200 上的 localhost 上运行,请确保 Kibana 配置正确。

打开 Kibana 配置文件:

sudo vi /opt/kibana/config/kibana.yml

然后确保 elasticsearch_url 设置正确。

/opt/kibana/config/kibana.yml excerpt:# The Elasticsearch instance to use for all your queries.
elasticsearch_url: "http://localhost:9200"

保存并退出。

现在重新启动 Kibana 服务以使您的更改到位:

sudo service kibana restart

Kibana 重新启动后,在 Web 浏览器中打开 Kibana 并验证错误是否已解决。

问题:无法访问 Kibana

ELK 堆栈的 Nginx 组件用作 Kibana 的反向代理。 如果 Nginx 未运行或未正确配置,您将无法访问 Kibana 界面。 但是,由于其他 ELK 组件不依赖于 Nginx,它们很可能运行良好。

原因:Nginx 没有运行

如果 Nginx 没有运行,并且您尝试在 Web 浏览器中访问您的 ELK 堆栈,您可能会看到类似于此的错误:

Nginx Error:This webpage is not available
ERR_CONNECTION_REFUSED

这通常表明 Nginx 没有运行。

您可以使用以下命令检查 Nginx 服务的状态:

sudo service nginx status

如果它报告服务未运行或无法识别,请按照 ELK 堆栈教程的 Install Nginx 部分 的说明解决您的问题。 如果它报告服务正在运行,您需要按照相同的说明重新配置 Nginx。

原因:Nginx 正在运行但无法连接到 Kibana

如果 Kibana 不可访问,并且您收到 502 Bad Gateway 错误,则 Nginx 正在运行,但无法连接到 Kibana。

解决此问题的第一步是检查 Kibana 是否正在使用以下命令运行:

sudo service kibana status

如果 Kibana 没有运行或无法识别,请按照 ELK 堆栈教程的 安装 Kibana 部分 的说明进行操作。

如果这不能解决问题,您的 Nginx 配置可能存在问题。 您应该查看 ELK 堆栈教程的 Install Nginx 部分 的配置部分。 您可以查看 Nginx 错误日志以获取线索:

sudo tail /var/log/nginx/error.log

这应该可以准确地告诉您 Nginx 无法连接到 Kibana 的原因。

原因:无法验证用户

如果您启用了基本身份验证,并且无法通过身份验证步骤,则应查看 Nginx 错误日志以确定问题的细节。

要查看最近的 Nginx 错误,请使用以下命令:

sudo tail /var/log/nginx/error.log

如果您看到 user was not found 错误,则用户在 htpasswd 文件中不存在。 此类错误由以下日志条目指示:

Nginx error logs (user was not found):2015/10/26 12:11:57 [error] 3933#0: *242 user "NonExistentUser" was not found in "/etc/nginx/htpasswd.users", client: 108.60.145.130, server: example.com, request: "GET / HTTP/1.1", host: "45.55.252.231"

如果您看到 password mismatch 错误,则用户存在但您提供的密码不正确。 此类错误由以下日志条目指示:

Nginx error logs (user password mismatch):2015/10/26 12:12:56 [error] 3933#0: *242 user "kibanaadmin": password mismatch, client: 108.60.145.130, server: example.com, request: "GET / HTTP/1.1", host: "45.55.252.231"

这两个错误的解决方法是提供正确的登录信息,或者使用您期望存在的用户登录来修改现有的 htpasswd 文件。 例如,要在 htpasswd.users 文件中创建或覆盖名为 kibanaadmin 的用户,请使用以下命令:

sudo htpasswd /etc/nginx/htpasswd.users kibanaadmin

然后提供您想要的密码并确认。

如果您看到 No such file or directory 错误,则 Nginx 配置中指定的 htpasswd 文件不存在。 此类错误由以下日志条目指示:

Nginx error logs (htpasswd file does not exist):2015/10/26 12:17:38 [error] 3933#0: *266 open() "/etc/nginx/htpasswd.users" failed (2: No such file or directory), client: 108.60.145.130, server: example.com, request: "GET / HTTP/1.1", host: "45.55.252.231"

在这里,您应该创建一个新的 /etc/nginx/htpasswd.users 文件,并向其中添加一个用户(在本例中为 kibanaadmin),使用以下命令:

sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

输入新密码并确认。

现在,尝试以您刚刚创建的用户身份进行身份验证。

Logstash:如何检查它是否正在运行

如果 Logstash 未运行,您将无法接收和解析来自 Filebeat 等日志传送器的日志,并将处理后的日志存储在 Elasticsearch 中。 本节将向您展示如何检查 Logstash 是否正常运行。

验证服务是否正在运行

最基本的要检查的是 Logstash status 的状态:

sudo service logstash status

如果 Logstash 正在运行,您将看到以下输出:

Logstash status (OK):logstash is running

否则,如果服务未运行,您将看到以下消息:

Logstash status (Bad):logstash is not running

如果 Logstash 没有运行,请尝试使用以下命令启动它:

sudo service logstash start

然后在几秒钟后再次检查其状态。 Logstash 是一个 Java 应用程序,它会在每次启动尝试后报告为“正在运行”几秒钟,因此在检查“未运行”状态之前等待几秒钟是很重要的。 如果它报告为“未运行”,则可能是配置错误。 接下来的两节介绍了常见 Logstash 问题的故障排除。

问题:Logstash 未运行

如果 Logstash 没有运行,有几个潜在的原因。 本节将介绍 Logstash 无法运行的各种常见情况,并提出潜在的解决方案。

原因:配置包含语法错误

如果 Logstash 的配置文件(位于 /etc/logstash/conf.d 目录下)有错误,则服务将无法正常启动。 最好的办法是检查 Logstash 日志以获取有关失败原因的线索。

打开与服务器的两个终端会话,以便在尝试启动服务时查看 Logstash 日志。

在第一个终端会话中,我们将查看日志:

tail -f /var/log/logstash/logstash.log

这将显示最后几个日志条目,以及任何未来的日志条目。

在第二个终端会话中,尝试启动 Logstash 服务:

sudo service logstash start

切换回第一个终端会话以查看 Logstash 启动时生成的日志。

如果您看到包含错误消息的日志条目,请尝试阅读这些消息以找出问题所在。 如果 Logstash 配置存在语法错误(大括号不匹配),您可能会看到以下错误日志示例:

Logstash logs (Syntax error):...
{:timestamp=>"2015-10-28T11:51:09.205000-0400", :message=>"Error: Expected one of #, => at line 12, column 6 (byte 209) after input {\n  lumberjack {\n    port => 5043\n    type => \"logs\"\n    ssl_certificate => \"/etc/pki/tls/certs/logstash-forwarder.crt\"\n    ssl_key => \"/etc/pki/tls/private/logstash-forwarder.key\"\n  \n}\n\n\nfilter {\n  if "}
{:timestamp=>"2015-10-28T11:51:09.228000-0400", :message=>"You may be interested in the '--configtest' flag which you can\nuse to validate logstash's configuration before you choose\nto restart a running system."}

最后一条消息表明我们可能对验证配置感兴趣,这表明配置包含语法错误。 上一条消息提供了更具体的错误消息,在这种情况下,配置的 input 部分中缺少右花括号。 要解决此问题,请编辑 Logstash 配置的违规部分:

sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

找到有错误条目的行,并修复它,然后保存并退出。

现在,在第二个终端上,启动 Logstash 服务:

sudo service logstash start

如果问题已解决,则不应有新的日志条目(Logstash 不会记录成功的启动)。 几秒钟后,检查 Logstash 服务的状态:

sudo service logstash status

如果它正在运行,那么您已经解决了问题。

您可能遇到与我们的示例不同的配置问题。 我们将介绍其他一些常见的 Logstash 配置问题。 与往常一样,如果您能够弄清楚错误的含义,请尝试自己修复它。

原因:SSL 文件不存在

Logstash 未运行的另一个常见原因是 SSL 证书和密钥文件存在问题。 例如,如果它们在您的 Logstash 配置指定的位置不存在,您的日志将显示如下错误:

Logstash logs (SSL key file does not exist):{:timestamp=>"2017-12-01T16:51:31.656000+0000", :message=>"Invalid setting for beats input plugin:\n\n  input {\n    beats {\n      # This setting must be a path\n      # File does not exist or cannot be opened /etc/pki/tls/certs/logstash-forwarder.crt\n      ssl_certificate => \"/etc/pki/tls/certs/logstash-forwarder.crt\"\n      ...\n    }\n  }", :level=>:error}
{:timestamp=>"2017-12-01T16:51:31.671000+0000", :message=>"Invalid setting for beats input plugin:\n\n  input {\n    beats {\n      # This setting must be a path\n      # File does not exist or cannot be opened /etc/pki/tls/private/logstash-forwarder.key\n      ssl_key => \"/etc/pki/tls/private/logstash-forwarder.key\"\n      ...\n    }\n  }", :level=>:error}
{:timestamp=>"2017-12-01T16:51:31.685000+0000", :message=>"Error: Something is wrong with your configuration.", :level=>:error}

要解决此特定问题,您需要确保您有一个 SSL 密钥文件( 生成一个 ,如果您忘记了),并且它被放置在正确的位置(/etc/pki/tls/private/logstash-forwarder.key,在示例中)。 如果您已经有一个密钥文件,请确保将其移动到正确的位置,并确保 Logstash 配置指向它。

现在,启动 Logstash 服务:

sudo service logstash start

如果问题已解决,则不应有新的日志条目。 几秒钟后,检查 Logstash 服务的状态:

sudo service logstash status

如果它正在运行,那么您已经解决了问题。

问题:Logstash 正在运行,但未在 Elasticsearch 中存储日志

如果 Logstash 正在运行但没有将日志存储在 Elasticsearch 中,那是因为它无法访问 Elasticsearch。 通常,这是 Elasticsearch 未运行的结果。 如果是这种情况,Logstash 日志将显示如下错误消息:

Logstash logs (Elasticsearch isn't running):{:timestamp=>"2017-12-01T16:53:29.571000+0000", :message=>"Connection refused (Connection refused)", :class=>"Manticore::SocketException", :backtrace=>[ruby-backtrace-info-here], :level=>:error}

在这种情况下,请按照 Elasticsearch 故障排除步骤确保 Elasticsearch 正在运行。

您可能还会看到如下错误:

Logstash logs (Logstash is configured to send its output to the wrong host):{:timestamp=>"2017-12-01T16:56:26.274000+0000", :message=>"Attempted to send a bulk request to Elasticsearch configured at '[\"http://localhost:9200/\"]', but Elasticsearch appears to be unreachable or down!", :error_message=>"Connection refused (Connection refused)", :class=>"Manticore::SocketException", :client_config=>{:hosts=>["http://localhost:9200/"], :ssl=>nil, :transport_options=>{:socket_timeout=>0, :request_timeout=>0, :proxy=>nil, :ssl=>{}}, :transport_class=>Elasticsearch::Transport::Transport::HTTP::Manticore, :logger=>nil, :tracer=>nil, :reload_connections=>false, :retry_on_failure=>false, :reload_on_failure=>false, :randomize_hosts=>false}, :level=>:error}
{:timestamp=>"2017-12-01T16:57:49.090000+0000", :message=>"SIGTERM received. Shutting down the pipeline.", :level=>:warn}

这表明您的 Logstash 配置的 output 部分可能指向错误的主机。 要解决此问题,请确保 Elasticsearch 正在运行,并检查您的 Logstash 配置:

sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf

验证 hosts => ["localhost:9200"] 行是否指向运行 Elasticsearch 的主机

Logstash output configuration excerptoutput {
  elasticsearch {
    hosts => ["localhost:9200"]
    sniffing => true
. . .

保存并退出。 此示例假设 Elasticsearch 在 localhost 上运行。

重新启动 Logstash 服务。

sudo service logstash restart

然后检查 Logstash 日志是否有任何错误。

Filebeat:如何检查它是否正在运行

Filebeat 在您的 Client 机器上运行,并将日志发送到您的 ELK 服务器。 如果 Filebeat 未运行,您将无法将各种日志发送到 Logstash。 因此,日志不会存储在 Elasticsearch 中,也不会出现在 Kibana 中。 本节将向您展示如何检查 Filebeat 是否正常运行。

验证日志是否成功传送

判断 Filebeat 是否正确地将日志传送到 Logstash 的最简单方法是检查 syslog 日志中的 Filebeat 错误。

sudo tail /var/log/syslog | grep filebeat

如果一切设置正确,您应该在停止或启动 Filebeat 进程时看到一些日志条目,但没有其他内容。

如果您没有看到任何日志条目,则应验证 Filebeat 是否正在运行。

验证服务是否正在运行

最基本的要检查的是 Filebeat 的状态:

sudo service filebeat status

如果 Filebeat 正在运行,您将看到以下输出:

Output* filebeat is running

否则,如果服务未运行,您将看到以下消息:

Output * filebeat is not running

如果 Filebeat 没有运行,请尝试使用以下命令启动它:

sudo service filebeat start

然后再次检查状态。 如果这不能解决问题,以下部分将帮助您解决 Filebeat 问题。 我们将介绍常见的 Filebeat 问题,以及如何解决这些问题。

问题:Filebeat 未运行

如果 Filebeat 没有在您的 客户端 机器上运行,有几个潜在的原因。 本节将介绍 Filebeat 无法运行的各种常见情况,并提出可能的解决方案。

原因:配置包含语法错误

如果 Filebeat 的配置文件(位于 /etc/filebeat/filebeat.yml)有错误,服务将无法正常启动。 它将立即退出,并出现如下错误:

OutputLoading config file error: YAML config parsing failed on /etc/filebeat/filebeat.yml: yaml: line 13: could not find expected ':'. Exiting.

在这种情况下,配置文件中存在拼写错误。 要解决此问题,请编辑 Filebeat 配置的违规部分。 如需指导,请遵循 ELK 堆栈教程的 Set Up Filebeat (Add Client Servers)) 的 Configure Filebeat 小节。

编辑 Filebeat 配置后,再次尝试启动服务:

sudo service filebeat start

如果您没有看到错误输出,则问题已解决。

原因:SSL 证书丢失或无效

Filebeat 和 Logstash 之间的通信需要 SSL 证书来进行身份验证和加密。 如果 Filebeat 没有正常启动,您应该检查 syslog 是否有类似以下的错误:

OutputError Initialising publisher: open /etc/pki/tls/certs/logstash-forwarder.crt: no such file or directory

这表明 logstash-forwarder.crt 文件不在适当的位置。 要解决此问题,请按照 ELK 堆栈教程的 设置 Filebeat(添加客户端服务器)部分 的相应小节,将 SSL 证书从 ELK 服务器复制到您的客户端计算机。

将适当的 SSL 证书文件放置在适当的位置后,再次尝试启动 Filebeat。

如果 SSL 证书无效,则日志应如下所示:

syslog (Certificate is invalid):transport.go:125: SSL client failed to connect with: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "elk.example.com")

请注意,错误消息表明证书存在,但无效。 在这种情况下,您需要按照ELK堆栈教程的生成SSL证书部分,然后将SSL证书复制到客户端计算机(设置Filebeat(添加客户端服务器)) .

在确保证书有效并且它位于正确的位置后,您需要重新启动 Logstash(在 ELK 服务器上)以强制它使用新的 SSL 密钥:

sudo service logstash restart

然后启动 Filebeat(在客户端机器上):

sudo service filebeat start

再次检查日志,以确保问题已得到解决。

问题:Filebeat 无法连接到 Logstash

如果 Filebeat(您的客户端服务器)无法访问 Logstash(在 ELK 服务器上),您将看到如下错误日志条目:

syslog  (Connection refused):transport.go:125: SSL client failed to connect with: dial tcp 203.0.113.4:5044: getsockopt: connection refused

Logstash 无法访问的常见原因包括:

  • Logstash 未运行(在 ELK 服务器上)
  • 任一服务器上的防火墙阻止端口 5043 上的连接
  • Filebeat 未配置正确的 IP 地址、主机名或端口

要解决此问题,请首先按照本指南的 Logstash 故障排除部分验证 Logstash 是否在 ELK 服务器上运行。 其次,验证防火墙没有阻止网络流量。 第三,验证 Filebeat 是否配置了正确的 IP 地址(或主机名)和 ELK 服务器的端口。

可以使用以下命令编辑 Filebeat 配置:

sudo vi /etc/filebeat/filebeat.yml

验证Logstash连接信息无误后,尝试重启Filebeat:

sudo service filebeat restart

再次检查 Filebeat 日志,以确保问题已得到解决。

有关一般 Filebeat 指导,请遵循 ELK 堆栈教程的 设置 Filebeat(添加客户端服务器)配置 Filebeat 小节。

Elasticsearch:如何检查它是否正在运行

如果 Elasticsearch 没有运行,您的 ELK 堆栈将不会运行。 Logstash 将无法向 Elasticsearch 添加新日志,并且 Kibana 将无法从 Elasticsearch 检索日志以进行报告。 本节将向您展示如何检查 Elasticsearch 是否正常运行。

验证服务是否正在运行

最基本的要检查的是 Elasticsearch 服务的状态:

sudo service elasticsearch status

如果 Elasticsearch 正在运行,您将看到以下输出:

Elasticsearch status (OK): * elasticsearch is running

否则,如果服务未运行,您将看到以下消息:

Elasticsearch status (Bad): * elasticsearch is not running

在这种情况下,您应该遵循接下来的几个部分,其中涵盖了 Elasticsearch 的故障排除。

验证它是否响应 HTTP 请求

默认情况下,Elasticsearch 响应端口 9200 上的 HTTP 请求(可以在其配置文件中通过指定新的 http.port 值来自定义)。 我们可以使用 curl 向 Elasticsearch 发送请求,并从 Elasticsearch 中检索有用信息。

通过以下命令使用 curl 发送 HTTP GET 请求(假设可以在 localhost 访问您的 Elasticsearch):

curl localhost:9200

如果 Elasticsearch 正在运行,您应该会看到如下所示的响应:

Output{
  "name" : "Hildegarde",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "E8q9kr-0RxycYhSLNx8xeA",
  "version" : {
    "number" : "2.4.6",
    "build_hash" : "5376dca9f70f3abef96a77f4bb22720ace8240fd",
    "build_timestamp" : "2017-07-18T12:17:44Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.4"
  },
  "tagline" : "You Know, for Search"
}

您还可以使用以下命令检查 Elasticsearch 集群的运行状况:

curl localhost:9200/_cluster/health?pretty

您的输出应如下所示:

Output{
  "cluster_name" : "elasticsearch",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 6,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 6,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 50.0
}

请注意,如果您的 Elasticsearch 集群由单个节点组成,您的集群可能会有 yellow 状态。 这对于单节点集群来说是正常的; 您可以通过向 Elasticsearch 集群添加至少一个节点来升级到 green 状态。

问题:Elasticsearch 没有运行

如果 Elasticsearch 没有运行,有很多潜在的原因。 本节将介绍 Elasticsearch 无法运行的各种常见情况,并提出潜在的解决方案。

原因:从未启动

如果 Elasticsearch 没有运行,它可能一开始就没有启动; Elasticsearch 安装后不会自动启动。 解决方案是第一次手动启动它:

sudo service elasticsearch start

这应该报告 Elasticsearch 正在启动。 等待大约 10 秒,然后再次检查 Elasticsearch 状态的状态。

原因:Elasticsearch服务没有开启,服务器重启了

如果 Elasticsearch 工作正常但不再工作,则可能无法正确启用。 默认情况下,Elasticsearch 服务未启用在启动时启动,您必须明确启用 Elasticsearch 以在启动时自动启动:

sudo update-rc.d elasticsearch defaults 95 10

Elasticsearch 现在应该会在启动时自动启动。 通过重新启动服务器来测试它是否有效。

原因:Elasticsearch 配置错误

如果 Elasticsearch 在其位于 /etc/elasticsearch/elasticsearch.yml 的配置文件中有错误,则服务将无法正常启动。 最好的办法是检查 Elasticsearch 错误日志以获取有关它失败原因的线索。

打开到您的服务器的两个终端会话,以便您可以在尝试启动服务时查看 Elasticsearch 日志。

在第一个终端会话中,我们将查看日志:

tail -f /var/log/elasticsearch/elasticsearch.log

这将显示最后几个日志条目,以及任何未来的日志条目。

在第二个终端会话中,尝试启动 Elasticsearch 服务:

sudo service elasticsearch start

切换回第一个终端会话以查看 Elasticsearch 启动时生成的日志。

如果您看到指示错误或异常的日志条目(例如 ERRORExceptionerror),尝试找到指示错误原因的行。 如果 Elasticsearch network.host 设置为不可解析的主机名或 IP 地址,您将看到以下错误日志示例:

Elasticsearch logs (Bad):...
[2015-10-27 15:24:43,495][INFO ][node                     ] [Shadrac] starting ...
[2015-10-27 15:24:43,626][ERROR][bootstrap                ] [Shadrac] Exception
org.elasticsearch.transport.BindTransportException: Failed to resolve host [null]
    at org.elasticsearch.transport.netty.NettyTransport.bindServerBootstrap(NettyTransport.java:402)
    at org.elasticsearch.transport.netty.NettyTransport.doStart(NettyTransport.java:283)
    at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:85)
    at org.elasticsearch.transport.TransportService.doStart(TransportService.java:153)
    at org.elasticsearch.common.component.AbstractLifecycleComponent.start(AbstractLifecycleComponent.java:85)
    at org.elasticsearch.node.internal.InternalNode.start(InternalNode.java:257)
    at org.elasticsearch.bootstrap.Bootstrap.start(Bootstrap.java:160)
    at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.java:248)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:32)
Caused by: java.net.UnknownHostException: incorrect_hostname: unknown error
...

请注意,示例日志的最后一行表明发生了 UnknownHostException: incorrect_hostname 错误。 此特定示例表明 network.host 设置为 incorrect_hostname,它无法解析任何内容。 在单节点 Elasticsearch 设置中,应将其设置为 localhost127.0.0.1

要解决此问题,请编辑 Elasticsearch 配置文件:

sudo vi /etc/elasticsearch/elasticsearch.yml

找到有错误条目的行,并修复它。 在示例的情况下,我们应该查找指定 network.host: incorrect_hostname 的行并将其更改为如下所示:

/etc/elasticsearch/elasticsearch.yml 摘录

...
network.host: localhost
...

保存并退出。

现在,在第二个终端上,启动 Elasticsearch 服务:

sudo service elasticsearch start

如果问题已解决,您应该会看到指示 Elasticsearch 已启动的无错误日志。 它可能看起来像这样:

Elasticsearch logs (Good):...
[2015-10-27 15:29:21,980][INFO ][node                     ] [Garrison Kane] initializing ...
[2015-10-27 15:29:22,084][INFO ][plugins                  ] [Garrison Kane] loaded [], sites []
[2015-10-27 15:29:22,124][INFO ][env                      ] [Garrison Kane] using [1] data paths, mounts [[/ (/dev/vda1)]], net usable_space [52.1gb], net total_space [58.9gb], types [ext4]
[2015-10-27 15:29:24,532][INFO ][node                     ] [Garrison Kane] initialized
[2015-10-27 15:29:24,533][INFO ][node                     ] [Garrison Kane] starting ...
[2015-10-27 15:29:24,646][INFO ][transport                ] [Garrison Kane] bound_address {inet[/127.0.0.1:9300]}, publish_address {inet[localhost/127.0.0.1:9300]}
[2015-10-27 15:29:24,682][INFO ][discovery                ] [Garrison Kane] elasticsearch/WJvkRFnbQ5mLTgOatk0afQ
[2015-10-27 15:29:28,460][INFO ][cluster.service          ] [Garrison Kane] new_master [Garrison Kane][WJvkRFnbQ5mLTgOatk0afQ][elk-run][inet[localhost/127.0.0.1:9300]], reason: zen-disco-join (elected_as_master)
[2015-10-27 15:29:28,561][INFO ][http                     ] [Garrison Kane] bound_address {inet[/127.0.0.1:9200]}, publish_address {inet[localhost/127.0.0.1:9200]}
[2015-10-27 15:29:28,562][INFO ][node                     ] [Garrison Kane] started
...

现在,如果您检查 Elasticsearch 状态,您应该会看到它运行良好。

您可能遇到与我们的示例不同的配置问题。 如果您能够弄清楚错误的含义,请尝试自己修复它。 如果失败,请尝试在 Internet 上搜索不包含特定于您的服务器的信息的单个错误行(例如 IP 地址或自动生成的 Elasticsearch 节点名称)。

结论

希望本故障排除指南可以帮助您解决您在设置 ELK 堆栈时遇到的任何问题。 如果您有任何问题或建议,请在下面的评论中留下!