Elastic stack 是一个工具三驾马车,包括 Elasticsearch、Logstash 和 Kibana 。这些工具提供了一个免费的开源解决方案,用于搜索、收集和分析数据。该数据可以来自任何来源并采用任何格式。他们还实时可视化数据。
笔记
本指南使用 Elastic stack 7.11 版本,这是撰写本文时的最新版本。
在本指南中
本指南展示了如何:
- 安装 Elasticsearch、Logstash 和 Kibana。
- 将 Elasticsearch 配置为使用一个分片且无副本运行,这适合在单个 Linode 上进行测试。
- 配置 Logstash以处理来自 Apache Web 服务器的日志。
- 将 Kibana 连接到 Logstash 索引。
- 查看Kibana 中连接的 Logstash 索引中的日志。
- 在 Kibana 中搜索日志。
- 在 Kibana 中以饼图形式可视化日志,按 HTTP 响应代码分类。
在你开始之前
- 熟悉我们的入门指南并创建一个 Linode 来安装 Elastic stack。然后,完成设置 Linode 主机名和时区的步骤。
笔记
在本指南中,多个服务在单个 Linode 上运行。我们建议使用至少 2G(或g6-standard-1
)大小的 Linode 实例来支持这些服务。 - 本指南
sudo
尽可能使用。完成我们的设置和保护计算实例指南的各个部分,以创建具有权限的标准用户帐户sudo
、强化 SSH 访问并删除不必要的网络服务。
笔记
需要提升权限的命令以 为前缀sudo
。如果您不熟悉该sudo
命令,可以查看我们的用户和组指南。 - 更新您的系统:
sudo apt-get update && sudo apt-get upgrade
- 按照我们的Ubuntu 18.04 上的 Apache Web 服务器指南中的步骤在您的服务器上设置和配置 Apache。
- Elasticsearch 包与其自己的 Java 运行时版本捆绑在一起,但 Logstash 要求系统上存在 Java。安装 Ubuntu 18.04 上可用的默认 Java 版本:
sudo apt-get install default-jre-headless
安装弹性堆栈
在配置和加载日志数据之前,请单独安装堆栈的每个部分。
安装弹性 APT 存储库
Elastic 包存储库包含本教程所需的所有包,因此请先安装它,然后再继续处理各个服务。
- 安装官方 Elastic APT 包签名密钥:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
- 将 APT 存储库信息添加到服务器的源列表中:
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
- 刷新可用包列表:
sudo apt-get update
安装Elasticsearch
- 安装
elasticsearch
包:sudo apt-get install elasticsearch
- 将 JVM 堆大小设置为服务器可用内存的大约四分之一。例如,在内存为2GB的Linode实例上,请确保文件中的
Xms
和Xmx
值/etc/elasticsearch/jvm.options
设置为以下内容,并且保持该文件中的其他值不变。- 文件:/etc/elasticsearch/jvm.options
-
1 2
-Xms512m -Xmx512m
笔记
默认情况下,这些选项被注释掉并具有以下值。因此,您还需要取消注释这些行(通过删除#
行开头的两个符号):## -Xms4g ## -Xmx4g
- 启动并启用
elasticsearch
服务:sudo systemctl enable elasticsearch sudo systemctl start elasticsearch
- 稍等片刻,让服务启动,然后确认 Elasticsearch API 可用:
curl localhost:9200
Elasticsearch 可能需要一些时间才能启动。如果需要判断服务是否启动成功,可以使用命令
systemctl status elasticsearch
查看最近的日志。Elasticsearch REST API 应返回类似于以下内容的 JSON 响应:{ "name" : "localhost", "cluster_name" : "elasticsearch", "cluster_uuid" : "tTuwONK4QMW918XkF9VecQ", "version" : { "number" : "7.11.1", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "ff17057114c2199c9c1bbecc727003a907c0db7a", "build_date" : "2021-02-15T13:44:09.394032Z", "build_snapshot" : false, "lucene_version" : "8.7.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
安装Logstash
安装logstash
包:
sudo apt-get install logstash
安装 Kibana
安装kibana
包:
sudo apt-get install kibana
配置弹性堆栈
配置 Elasticsearch
默认情况下,Elasticsearch 为每个创建的索引创建五个分片和一个副本。当部署到生产环境时,这些是可以使用的合理设置。在本教程中,Elasticsearch 设置中仅使用一台服务器。多个分片和副本是不必要的。更改这些默认值可以避免不必要的开销。
- 使用索引模板在用户的主文件夹中创建临时 JSON 文件。
*
此模板指示 Elasticsearch 将所有匹配索引名称(在本例中为通配符)的分片数量设置为 1,并将副本数量设置为零:- 文件:模板.json
-
1 2 3 4 5 6 7 8 9 10 11
{ "index_patterns": ["*"], "template": { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 0 } } } }
- 用于
curl
创建具有以下设置的索引模板,该设置将应用于此后创建的所有索引:curl -XPUT -H'Content-type: application/json' http://localhost:9200/_index_template/defaults -d @template.json
Elasticsearch 应该返回:
{"acknowledged":true}
配置Logstash
为了收集 Apache 访问日志,Logstash 必须配置为监视任何必要的文件,然后处理它们,最终将它们发送到 Elasticsearch。
- 将 JVM 堆大小设置为服务器可用内存的大约四分之一。例如,如果您的服务器有 2GB RAM,请将文件中的
Xms
和Xmx
值更改/etc/logstash/jvm.options
为以下内容,并保持此文件中的其他值不变:- 文件:/etc/logstash/jvm.options
-
1 2
-Xms512m -Xmx512m
笔记
默认情况下,这些选项具有以下值:## -Xms1g ## -Xmx1g
- 创建以下 Logstash 配置:
- 文件:/etc/logstash/conf.d/apache.conf
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
input { file { path => '/var/www/*/logs/access.log' start_position => 'beginning' } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } output { elasticsearch { } }
笔记
此示例配置假设您的网站日志存储在/var/www/*/logs/access.log
文件路径中。
如果您的站点是按照Ubuntu 18.04 上的 Apache Web Server指南的配置 Apache 进行虚拟主机部分设置的,那么您的日志将存储在此位置。如果您的网站日志存储在其他位置,请先更新配置文件中的文件路径,然后再继续。 - 启动并启用
logstash
:sudo systemctl enable logstash sudo systemctl start logstash
配置 Kibana
- 启用并启动 Kibana 服务:
sudo systemctl enable kibana sudo systemctl start kibana
- 为了让 Kibana 找到日志条目,必须首先将日志发送到 Elasticsearch。启动三个守护进程后,应使用 Logstash 收集日志文件并将其存储在 Elasticsearch 中。要生成日志,请向 Apache 发出多个请求:
for i in `seq 1 5` ; do curl localhost ; sleep 0.2 ; done
- 默认情况下,Kibana 绑定到本地地址
127.0.0.1
。这仅允许来自本地主机的连接。建议这样做是为了避免将仪表板暴露在公共互联网上。但是,为了在浏览器中访问 Kibana 的 Web 界面,该ssh
命令可以将端口转发到您的工作站。
在本地终端(在您的本地计算机上,而不是在 Linode 上)运行以下命令。在本教程期间让命令保持运行状态。在本教程结束时按Ctrl-C
结束端口转发。ssh -N -L 5601:localhost:5601 <your Linode's IP address>
- 接下来,在浏览器中打开 Kibana,地址为http://localhost:5601。登陆页面应类似于以下内容。单击“Explore on my own”开始配置 Kibana。
笔记
Kibana 第一次启动时,守护进程会执行多个优化步骤,这些步骤可能会延迟启动时间。如果网页无法立即可用,请等待几分钟或使用命令检查日志sudo journalctl -u kibana
。 - 出现以下仪表板界面。点击顶部导航左侧的汉堡按钮,打开侧边栏界面。
- 单击侧栏中的“发现”菜单项。
- Kibana 会提示您创建索引模式,该模式标识应检索的日志。单击创建索引模式按钮。
- 将出现“创建索引模式”窗体。
logstash-*
在索引模式名称字段中输入文本。然后单击下一步按钮继续。 - 从时间字段下拉菜单中,选择
@timestamp
作为时间字段。这与从 Web 服务器日志中解析的时间相对应。单击创建索引模式按钮继续。
Kibana 现在能够显示存储在与logstash-*
通配符模式匹配的索引中的日志。
在 Kibana 中查看日志
curl
当前面的命令在 Apache 访问日志中生成条目时,Logstash 在 Elasticsearch 中对它们建立了索引。这些现在在 Kibana 中可见。
笔记
根据 Kibana 界面右上角显示的时间窗口检索日志。默认情况下,此面板显示“过去 15 分钟”。在某些时候,您可能会发现 Kibana 界面中未显示日志条目。如果发生这种情况,请单击时间跨度面板并选择更大的范围,例如“过去一小时”或“过去 4 小时”。选择足够广泛的时间范围后,您的日志应该会出现。
- 从左侧菜单中,选择汉堡包图标以展开可用的菜单选项。
- 选择出现的“发现”菜单项。
- Discover 界面应显示日志事件的时间线:
随着时间的推移,当通过浏览器向 Web 服务器发出其他请求时
curl
,可以从 Kibana 查看和搜索其他日志。“发现”选项卡是熟悉索引日志结构并确定要搜索和分析内容的好方法。 - 要查看日志条目的详细信息,请单击下拉箭头查看各个文档字段:
字段表示从 Apache 日志解析的值,例如
agent
表示User-Agent
标头,bytes
表示 Web 服务器响应的大小。
在 Kibana 中搜索日志
- 在 Web 服务器日志中生成几个虚拟 404 日志事件,以演示如何在 Kibana 中搜索和分析日志:
for i in `seq 1 2` ; do curl localhost/notfound-$i ; sleep 0.2 ; done
- Kibana 界面中的顶部搜索栏允许您按照Kibana 查询语言搜索查询以查找结果。例如,要从 200 个 OK 请求中查找您生成的 404 错误请求,请在搜索框中输入以下内容:
response:404
- 然后,单击更新按钮。用户界面现在仅返回响应字段中包含“404”代码的日志。
在 Kibana 中可视化日志
Kibana 支持多种类型的 Elasticsearch 查询来深入了解索引数据。例如,考虑导致“404 - 未找到”响应代码的流量。使用聚合,可以提取有用的数据摘要并在 Kibana 中本地显示。
- 要创建可视化,请首先从侧栏中选择“可视化”菜单项。您可能首先需要使用界面左上角的汉堡包图标来展开菜单:
- 然后,在出现的页面上选择创建新的可视化按钮:
- 从出现的选项中选择基于聚合的选项:
- 从出现的选项中选择“饼图”以创建新的饼图。请注意,您可能需要向下滚动才能找到饼图可视化:
- 然后选择
logstash-*
索引模式以确定从何处检索饼图的数据: - 此时,饼图应该出现在准备配置的界面中。请按照以下步骤在饼图左侧显示的用户界面窗格中配置可视化效果:
- 在右侧边栏中的“存储桶”卡下选择“+ 添加” 。
- 选择“分割切片”可在可视化中创建多个切片。
- 从聚合下拉菜单中,选择术语以指示字段的唯一术语是饼图每个切片的基础。
- 从字段下拉菜单中,选择
response.keyword
。这表明该response
字段决定饼图切片的大小。 - 最后,单击“更新”按钮更新饼图并完成可视化。
笔记
您可能需要查看饼图更长的时间跨度才能同时显示 200 和 404 HTTP 响应。这可以通过单击搜索栏旁边的日历图标并选择较长的时间段(例如“过去 1 小时”)来完成。 - 请注意,只有部分请求返回了 404 响应代码(如果您的curl 请求发生早于您当前查看的时间,请记住更改时间跨度)。这种收集有关日志中字段值的汇总统计信息的方法可以类似地应用于其他字段,例如 http 动词(GET、POST 等)。或者,您甚至可以创建数值数据的摘要,例如给定时间段内传输的字节总量。
- 如果您希望保存此可视化以供以后使用,请单击浏览器窗口顶部附近的“保存”按钮来命名该可视化并将其永久保存到 Elasticsearch。
进一步阅读
本教程概述了 Elastic 堆栈的各个部分。您可以阅读更多内容来了解处理和查看数据的其他方法。例如:
- 附加 Logstash 过滤器可以丰富日志数据。
- 其他 Kibana 可视化可以以新的、有用的方式呈现数据。
Elastic 网站上提供了该堆栈各个部分的综合文档:
- Elasticsearch参考包含有关如何操作 Elasticsearch 的其他信息,包括集群、管理索引等。
- Logstash文档包含有关可以进一步处理原始数据的其他插件的有用信息,例如地理定位 IP 地址、解析用户代理字符串和其他插件。
- Kibana 的文档页面提供了有关如何创建有用的可视化和仪表板的附加信息。