ELK
是三个开源软件的缩写,分别表示: Elasticsearch
, Logstash
, Kibana
。
ELK
通常用来构建日志分析平台、数据分析搜索平台等
Elasticsearch
是个开源分布式全文检索和数据分析平台。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,负载均衡等特点。
Kibana
是一个针对Elasticsearch的开源数据分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。
Logstash
是一款基于插件的数据收集和处理引擎。Logstash 配有大量的插件,以便人们能够轻松进行配置以在多种不同的架构中收集、处理并转发数据。
Beats
轻量级的数据收集处理工具(Agent),具有占用资源少的优点,适合于在各个服务器上采集数据后传输给Logstash,官方也推荐此工具。Beats有多多种类型,比较常用的是 FileBeat
··· 处理过程可分为一个或多个管道。在每个管道中,会有一个或多个输入插件接收或收集数据,然后这些数据会加入内部队列。默认情况下,这些数据很少并且会存储于内存中,但是为了提高可靠性和弹性,也可进行配置以扩大规模并长期存储在磁盘上。
··· 处理线程会以小批量的形式从队列中读取数据,并通过任何配置的过滤插件按顺序进行处理。Logstash 自带大量的插件,能够满足特定类型的操作需要,也就是解析、处理并丰富数据的过程。
··· 处理完数据之后,处理线程会将数据发送到对应的输出插件,这些输出插件负责对数据进行格式化并进一步发送数据(例如发送到 Elasticsearch)
温馨提示:为保证您的身心健康,请最少给本虚拟机分配 1G+ 内存,最好2G/2G++++
下载后上传到root目录下
安装es
# 解压ES到usr目录下
[root@localhost ~]# tar -zxvf elasticsearch-6.4.0.tar.gz -C /usr
启动es
不能使用root用户启动es,否则会报错
[root@localhost elasticsearch-6.4.0]# groupadd es
[root@localhost elasticsearch-6.4.0]# useradd -g es es
# 把es的属主 属组 更改为 es用户 和 es组
[root@localhost elasticsearch-6.4.0]# chown -R es:es /usr/elasticsearch-6.4.0/
[root@localhost elasticsearch-6.4.0]# su es
[es@localhost elasticsearch-6.4.0]$ bin/elasticsearch
测试es是否启动成功
[root@localhost ~]# curl -X GET localhost:9200
{
"name" : "VAQeOmY",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "7S6buHWkRD-wtDxeH5ll7g",
"version" : {
"number" : "6.4.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "595516e",
"build_date" : "2018-08-17T23:18:47.308994Z",
"build_snapshot" : false,
"lucene_version" : "7.4.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
配置es的远程访问
[root@localhost elasticsearch-6.4.0]# vim config/elasticsearch.yml
51 # ---------------------------------- Network -----------------------------------
52 #
53 # Set the bind address to a specific IP (IPv4 or IPv6):
54 #
55 network.host: 192.168.23.141 #更改为本机ip
此时重启es服务会出现异常
需要更改到root用户更改如下配置
[root@localhost elasticsearch-6.4.0]# vim /etc/security/limits.conf
# 在文件末尾添加以下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
[root@localhost elasticsearch-6.4.0]# vim /etc/sysctl.conf
# 添加以下内容
vm.max_map_count=655360
[root@localhost elasticsearch-6.4.0]# sysctl -p
vm.max_map_count = 655360
# 重启虚拟机使更改生效
[root@localhost elasticsearch-6.4.0]# reboot
保证防火墙处于关闭状态
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
重启虚拟机后,再次启动es服务,打开浏览器访问 http://ip+9200
success!
Tips: 集成中文分词器
[es@localhost root]$ cd /usr/elasticsearch-6.4.0/
[es@localhost elasticsearch-6.4.0]$ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.0/elasticsearch-analysis-ik-6.4.0.zip
[es@localhost elasticsearch-6.4.0]$ ll plugins/
total 0
drwxr-xr-x. 2 es es 229 Jan 3 10:04 analysis-ik
# 重新启动es的服务
[root@localhost ~]# jps
2673 Elasticsearch
46151 Jps
40921 PluginCli
[root@localhost ~]# kill -9 2673
[root@localhost ~]# cd /usr/elasticsearch-6.4.0/
[root@localhost elasticsearch-6.4.0]# su es
[es@localhost elasticsearch-6.4.0]$ bin/elasticsearch
[root@localhost ~]# tar -zxvf kibana-6.4.0-linux-x86_64.tar.gz -C /usr
[root@localhost ~]# cd /usr/kibana-6.4.0-linux-x86_64/
[root@localhost kibana-6.4.0-linux-x86_64]# vim config/kibana.yml
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "192.168.252.113" #更改这里!!! 自己的虚拟机ip
# The URL of the Elasticsearch instance to use for all your queries.
elasticsearch.url: "http://192.168.252.113:9200" #更改这里!!! 自己的虚拟机ip+port
[root@localhost kibana-6.4.0-linux-x86_64]# bin/kibana
测试
打开浏览器访问 http://ip+5601
success!
[root@localhost ~]# tar -zxvf logstash-6.4.0.tar.gz -C /usr
[root@localhost logstash-6.4.0]# cd /usr/logstash-6.4.0/
# 创建一个测试用的配置文件
[root@localhost logstash-6.4.0]# vim config/simple.conf
# 第一个案例 配置内容如下
input {
file {
path => ["/root/testdata.log"] # 需要采集数据的文件
sincedb_path => "/dev/null"
start_position => "beginning" # 头开始读取文件
}
}
filter {
}
output {
stdout {
codec => rubydebug
}
}
启动测试
[root@localhost logstash-6.4.0]# bin/logstash -r -f config/simple.conf
[root@localhost ~]# vim testdata.log
# 输入内容
Hello Logstash
logstash向控制台提供的输出显示
{
"@timestamp" => 2019-01-06T03:04:18.645Z,
"path" => "/root/testdata.log",
"message" => "Hello Logstash",
"@version" => "1",
"host" => "localhost.localdomain"
}
至此,Elasticsearch、Logstash、Kibana分别已经搭建完成
但是我们的ELK平台还差一些配置才能完成
这里使用Nginx服务器的访问日志作为ELK平台的测试数据
请安装 Nginx
这里省略步骤,但是提供车票 https://nginx.org/en/download.html
安装Nginx需要先安装其依赖如gcc等
目前搭建的ELK平台以分析Nginx的访问日志access.log为例
当浏览器访问一次Nginx服务器,access.log文件中就会多出一条数据
(例)
192.168.252.113 - - [07/Jan/2019:03:38:21 -0500] "GET /favicon.ico HTTP/1.1" 404 571"http://192.168.23.143/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64)AppleWebKit/537.36 (KHTML,like Gecko) Chrome/71.0.3578.80 Safari/537.36"
其中
192.168.252.113 客户端地址
第一个 - 占位
第二个 - 客户端用户名
[07/Jan/2019:03:38:21 -0500] 服务器时间
GET /favicon.ico HTTP/1.1 请求内容,包括方法名,地址,和http协议
404 返回的http 状态码
571 返回的大小
http://192.168.252.113/ 可以记录用户是从哪个链接访问过来的
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36 用户所使用的代理(一般为浏览器)
geoip:使用GeoIP数据库对client_ip字段的IP地址进行解析,可得出该IP的经纬度、国家与城市等信息,但精确度不高,这主要依赖于GeoIP数据库;
date:默认情况下,elasticsearch内记录的date字段是elasticsearch接收到该日志的时间,但在实际应用中需要修改为日志中所记录的时间。这时候则需要指定记录时间的字段并指定时间格式。如果匹配成功,则会将日志的时间替换至date字段中。
上面的日志的过滤代码如下:
%{IPORHOST:client_ip} - %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %
{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" {NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:http_referer} %{QS:http_user_agent}
更多语法参考:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
测试Lostash
修改 Logstash 配置文件,内容如下:
[root@localhost config]# vim simple.conf
input {
file {
path => ["/usr/nginx/logs/access.log"] # 要监听的文件位置
sincedb_path => "/dev/null"
start_position => "beginning"
}
}
filter {
grok {
match =>{
"message" => "%{IPORHOST:client_ip} - %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:http_referer} %{QS:http_user_agent}"
}
}
geoip {
source => "client_ip"
}
date {
match => [ "time" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
}
output {
stdout {
codec => rubydebug
}
}
# 重启logstash
访问Nginx,Logstash向控制台提供的输出显示
{
"timestamp" => "07/Jan/2019:05:08:38 -0500",
"response" => "304",
"http_user_agent" => "\"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/71.0.3578.98 Safari/537.36\"",
"auth" => "-",
"httpversion" => "1.1",
"client_ip" => "110.52.250.126",
"message" => "110.52.250.126 - - [07/Jan/2019:05:08:38 -0500] \"GET / HTTP/1.1\"
304 0 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/71.0.3578.98 Safari/537.36\"",
"geoip" => {
"country_code2" => "CN",
"city_name" => "Changsha",
"latitude" => 28.1792,
"location" => {
"lon" => 113.1136,
"lat" => 28.1792
},
"country_name" => "China",
"timezone" => "Asia/Shanghai",
"longitude" => 113.1136,
"continent_code" => "AS",
"region_code" => "43",
"ip" => "110.52.250.126",
"country_code3" => "CN",
"region_name" => "Hunan"
},
"verb" => "GET",
"host" => "MiWiFi-R3P-srv",
"@timestamp" => 2019-01-07T10:22:39.711Z,
"bytes" => "0",
"path" => "/usr/local/nginx/logs/access.log",
"http_referer" => "\"-\"",
"@version" => "1",
"request" => "/"
}
success!
以上为测试Logstash是否能成功分析Nginx的访问日志,我们的搭建工作还没有完成
[root@localhost ~]# tar -zxvf filebeat-6.4.0-linux-x86_64.tar.gz -C /usr
[root@localhost ~]# vim /usr/filebeat-6.4.0-linux-x86_64/filebeat.yml
- type: log
# Change to true to enable this input configuration.
enabled: true # 第一处
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /usr/local/nginx/logs/access*.log #第二处 要监听的配置文件位置
------------------------------------------------------------------省略若干行
# output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
output.logstash:
# The Logstash hosts
hosts: ["192.168.252.113:5044"] #第三处 本机ip
配置解析 access*.log 日志文件 的Logstash的配置文件
[root@localhost filebeat-6.4.0-linux-x86_64]# cd /usr/logstash-6.4.0/config/
[root@localhost config]# vi elk.conf
# 配置输入为 beats
input {
beats {
port => "5044"
}
}
# 数据过滤 解析
filter {
grok {
match =>{
"message" => "%{IPORHOST:client_ip} - %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:http_referer} %{QS:http_user_agent}"
}
}
geoip {
source => "client_ip"
}
date {
match => [ "time" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
}
# 输出到本机的 ES
output {
elasticsearch {
hosts => [ "192.168.252.110:9200" ]
index => "logs-%{+YYYY.MM.dd}"
}
}
启动服务测试
# 启动logstash
[root@localhost logstash-6.4.0]# bin/logstash -r -f config/elk.conf
# 启动filebeat
[root@localhost filebeat-6.4.0-linux-x86_64]# ./filebeat