思考的稻草人 2017-09-26
ELK 不是一款软件,而是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELK Stack。根据 Google Trend 的信息显示,ELK Stack 已经成为目前最流行的集中式日志解决方案。
这种架构引入 Beats 作为日志搜集器。目前 Beats 包括四种:
Beats 将搜集到的数据发送到 Logstash,经 Logstash 解析、过滤后,将其发送到 Elasticsearch 存储,并由 Kibana 呈现给用户。详见图 3。
这种架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。相比 Logstash,Beats 所占系统的 CPU 和内存几乎可以忽略不计。另外,Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全。
因此这种架构适合对数据安全性要求较高,同时各服务器性能比较敏感的场景。
前面提到 Filebeat 已经完全替代了 Logstash-Forwarder 成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。这个章节将详细讲解如何部署基于 Filebeat 的 ELK 集中式日志解决方案,具体架构见图 5。
因为免费的 ELK 没有任何安全机制,所以这里使用了 Nginx 作反向代理,避免用户直接访问 Kibana 服务器。加上配置 Nginx 实现简单的用户认证,一定程度上提高安全性。另外,Nginx 本身具有负载均衡的作用,能够提高系统访问性能。
笔者使用的是CentOS7。
JDK 是 IBM Java 8。ELK 需要 Oracle 1.7(或者是 OpenJDK 1.7) 及以上,如果是 IBM Java,则需要 8 及以上的版本。
ELK 官网对于每种软件提供了多种格式的安装包(zip/tar/rpm/DEB),以 Linux 系列系统为例,如果直接下载 RPM,可以通过 rpm -ivh path_of_your_rpm_file
直接安装成系统 service。以后就可以使用 service 命令启停。比如 service elasticsearch start/stop/status
groupadd elk # 添加用户组 useradd -g elk elk # 添加用户到指定用户组 passwd elk # 为指定用户设置密码 |
切换到新创建的 elk 用户做如下操作。
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-x86_64.rpm wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.rpm wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.rpm wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-x86_64.rpm |
yum install java java-1.8.0-openjdk-devel.x86_64 |
rpm -ivh filebeat-5.2.2-x86_64.rpm rpm -ivh logstash-5.2.2.rpm rpm -ivh elasticsearch-5.2.2.rpm rpm -ivh kibana-5.2.2-x86_64 |
Filebeat 和 ELK 的安装很简单,比较难的是如何根据需求进行配置。这个章节简单介绍一下配置需求和配置方法。
1 2 3 4 5 | filebeat.prospectors: - input_type: log paths: - /var/log/ *.log #- c:\programdata\elasticsearch\logs\* |
对于最基本的Filebeat配置,您可以使用单个路径定义单个探测器。在这个例子中,探测器收录路径/var/log/*.log中的所有文件,这意味着Filebeat将收集以.log结尾的目录/var/log /中的所有文件。 Golang Glob支持的所有模式也在此支持。
#----------------------------- Logstash output --------------------------------<br>output.logstash:<br>hosts: ["127.0.0.1:5044"]
sudo /etc/init.d/filebeat start
首先,我们通过运行最基本的Logstash管道来测试您的Logstash安装。Logstash管道有两个必需元素,输入和输出以及一个可选元素,过滤器。 输入插件消耗来自源的数据,过滤器插件会按照您指定的方式修改数据,并且输出插件将数据写入到目的地。
测试您的Logstash安装,运行最基本的Logstash管道。 例如:
/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'
-e标志使您能够直接从命令行指定配置。 在命令行中指定配置可以快速测试配置,而无需在迭代之间编辑文件。 示例中的流水线从标准输入stdin输入,并将该输入以结构化格式移动到标准输出stdout。
启动Logstash后,等到看到“Pipeline main started”,然后在命令提示符下输入hello world,会看到如下输出:
1 2 3 4 5 6 | { "@timestamp" => 2017-04-13T06:02:08.393Z, "@version" => "1" , "host" => "localhost.localdomain" , "message" => "hello world" } |
恭喜! 您已创建并运行基本的Logstash管道。 接下来,将学习如何创建更逼真的管道。
1 2 3 4 5 6 7 8 9 10 11 12 13 | input { beats { port => "5044" } } # The filter part of this file is commented out to indicate that it is # optional. # filter { # # } output { stdout { codec => rubydebug } } |
保存后运行 bin/logstash -f first-pipeline.conf --config.test_and_exit
–config.test_and_exit 选项解析您的配置文件并报告任何错误。如果配置文件通过配置测试,请使用以下命令启动Logstash:bin/logstash -f first-pipeline.conf --config.reload.automatic
–config.reload.automatic 选项启用自动配置重新加载,以便每次修改配置文件时不必停止并重新启动Logstash。如果您的管道正常工作,您应该看到一系列类似于写入控制台的事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | { "request" => "/" , "agent" => "\"spiderman\"" , "geoip" => { "timezone" => "Asia/Shanghai" , "ip" => "42.156.251.187" , "latitude" => 30.2936, "coordinates" => [ [0] 120.1614, [1] 30.2936 ], "continent_code" => "AS" , "city_name" => "Hangzhou" , "country_code2" => "CN" , "country_name" => "China" , "country_code3" => "CN" , "region_name" => "Zhejiang" , "location" => [ [0] 120.1614, [1] 30.2936 ], "longitude" => 120.1614, "region_code" => "33" }, "offset" => 146998, "auth" => "-" , "ident" => "-" , "input_type" => "log" , "verb" => "GET" , "source" => "/usr/local/nginx/logs/shortUrl.access.log" , "type" => "nginx_access" , "tags" => [ [0] "beats_input_codec_plain_applied" ]} |
bin/logstash-plugin list
来查看具体插件1 2 3 4 5 | filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } |
保存更改。 由于您已启用自动配置重新加载,因此您不必重新启动Logstash来接收更改。
1 2 3 | geoip { source => "clientip" } |
测试我们的更改,我们需要强制Filebeat从头开始读取日志文件。 要执行此操作,请转到Filebeat正在运行的终端窗口,然后按Ctrl + C关闭Filebeat。 然后删除Filebeat注册表文件。 例如,运行:<br>sudo rm data/registry<br>
由于Filebeat存储注册表中收集的每个文件的状态,因此删除注册表文件会强制Filebeat读取从头开始捕获的所有文件。接下来重新启动Filebeat来验证我们的输出内容。