一、ELK日志分析系统简介
1.1 日志服务器
- 提高安全性
- 集中存放日志
- 缺陷
- 对日志的分析困难
- 对日志的分析困难
1.2 ELK日志分析系统
- Elasticsearch
- Logstash
- Kibana
1.3 日志处理步骤
【1】将日志进行集中化管理
【2】将日志格式化(Logstash)并输出到Elasticsearch
【3】对格式化后的数据进行索引和存储(Elasticsearch)
【4】前端数据的展示(Kibana)
二、Elasticsearch介绍
2.1 Elasticsearch的概述
- 提供了一个分布式多用户能力的全文搜索引擎
2.2 Elasticsearch核心概念
- 接近实时
- 群集
- 节点
- 索引
- 索引(库)----> 类型(表)-----> 文档(记录)
- 分片和副本
三、Logstash介绍
3.1 Logstash介绍
- 一款强大的数据处理工具
- 可实现 数据传输、格式处理、格式化输出
- 数据输入、数据加工(如过滤,改写等)以及数据输出
3.2 Logstash主要组件
- Shipper
- Indexer
- Broker
- Search and Storage
- Web Interface
四、Kibana介绍
4.1 Kibana介绍
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜素、查看存储在Elasticsearch索引中的数据
- 通过各种图表进行高级数据分析及展示
4.2 Kibana主要功能
- Elasticsearch无缝之集成
- 整合数据,复杂数据分析
- 让更多团队成员受益
- 接口灵活,分享更容易
- 配置简单,可视化多数据源
- 简单数据导出
五、部署ELK日志分析系统
5.1 部署ELK日志分析系统
5.1.1 案例拓扑
5.1.2 需求描述
- 配置ELK日志分析群集
- 使用Logstash收集日志
- 使用Kibana查看分析日志
5.1.3 设备列表
主机 操作系统 主机名 IP地址 主要软件
服务器 centos7.6 node1 14.0.0.77 Elasticsearch Kibana
服务器 centos7.6 node2 14.0.0.88 Elasticsearch
服务器 centos7.6 apache 14.0.0.99 Logstash Apache
5.1.4 准备安装环境
-关闭防火墙和Selinux
node1、node2节点内存分配4G,Apache节点分配1G内存
通过VMware虚拟网络Vmnet连接
5.1.5 安装步骤分析
- 环境准备
- 部署ELasticsearch软件
- 安装ELasticsearch-head插件
- Logstash安装及使用方法
- 安装Kibana
5.2 实验过程
【配置elasticsearch环境】
###登录14.0.0.77 更改主机名 配置域名解析 查看Java环境 ####
systemctl stop firewalld
setenforce 0
hostnamectl set-hostname node2
su
vim /etc/hosts
14.0.0.77 node1
14.0.0.88 node2
java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
【部署elasticsearch软件】
###登录14.0.0.77【node1】####
1、安装elasticsearch-rpm包
上传elasticsearch-5.5.0.rpm到/opt目录下
cd /opt
#拖入软件包
rpm -ivh elasticsearch-5.5.0.rpm
2、加载系统服务
systemctl daemon-reload
systemctl enable elasticsearch.service
3、更改elasticsearch主配置文件
#拷贝一份副本(一定要备份,防止出差错)
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
vim /etc/elasticsearch/elasticsearch.yml
17 cluster.name: my-elk-cluster ##集群名字
23 node.name: node1 ##节点名字
33 path.data: /data/elk_data ##数据存放路径(要自己创建)
37 path.logs: /var/log/elasticsearch/ ##日志文件存放位置
43 bootstrap.memory_lock: false ##不在启动的时候锁定内存
55 network.host: 0.0.0.0 ##提供服务绑定的IP地址(监听地址段),0.0.0.0代表所有地址
59 http.port: 9200 ##侦听端口为9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"] ##集群发现通过单播实现
[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: flase
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
4、创建数据存放路径并授权
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/ ##创建用户管理
5、启动elasticsearch是否成功开启
systemctl start elasticsearch.service
[root@node1 opt]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 97417/java
6、查看节点信息,用真机192.168.1.112的浏览器打开http://14.0.0.77:9200,有文件打开,下面的是节点的信息
[root@node1 opt]# curl 14.0.0.77:9200
{
"name" : "node1",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "1TESUYUhRyqeJEQV3Ev-YA",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
###登录14.0.0.88【node2】###
###与node1 配置一样
1、安装elasticsearch-rpm包
上传elasticsearch-5.5.0.rpm到/opt目录下
cd /opt
#拖入软件包
rpm -ivh elasticsearch-5.5.0.rpm
2、加载系统服务
systemctl daemon-reload
systemctl enable elasticsearch.service
3、更改elasticsearch主配置文件
#拷贝一份副本(一定要备份,防止出差错)
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
vim /etc/elasticsearch/elasticsearch.yml
17 cluster.name: my-elk-cluster ##集群名字
23 node.name: node1 ##节点名字
33 path.data: /data/elk_data ##数据存放路径(要自己创建)
37 path.logs: /var/log/elasticsearch/ ##日志文件存放位置
43 bootstrap.memory_lock: false ##不在启动的时候锁定内存
55 network.host: 0.0.0.0 ##提供服务绑定的IP地址(监听地址段),0.0.0.0代表所有地址
59 http.port: 9200 ##侦听端口为9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"] ##集群发现通过单播实现
[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: flase
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
4、创建数据存放路径并授权
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/ ##创建用户管理
5、启动elasticsearch是否成功开启
systemctl start elasticsearch.service
[root@node2 opt]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 97417/java
6、查看节点信息,用真机192.168.1.112的浏览器打开http://14.0.0.77:9200,有文件打开,下面的是节点的信息
[root@node2 opt]# curl 14.0.0.88:9200
{
"name" : "node1",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "1TESUYUhRyqeJEQV3Ev-YA",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
【集群检查健康状态】
在真机浏览器(谷歌或虚拟机火狐)打开http://14.0.0.77:9200/_cluster/health?pretty ##检查集群健康情况
{
"cluster_name" : "my-elk-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"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" : 100.0
}
在真机浏览器(谷歌或虚拟机火狐)打开http://14.0.0.77:9200/_cluster/state?pretty ##检查集群状态信息
{
"cluster_name" : "my-elk-cluster",
"version" : 3,
"state_uuid" : "2Gfne0fXSDGyFiDinb0RlQ",
"master_node" : "Hyv5IVg6SMCimaTZIokn3w",
"blocks" : { },
"nodes" : {
"sIzXX0iNQl-b5JCciAABMQ" : {
"name" : "node1",
"ephemeral_id" : "7H6yh-N0QAaG3l7u55eDZw",
"transport_address" : "14.0.0.88:9300",
"attributes" : { }
},
"Hyv5IVg6SMCimaTZIokn3w" : {
"name" : "node1",
"ephemeral_id" : "-wtz4UrWSlWE9LKMfCxzwg",
"transport_address" : "14.0.0.77:9300",
"attributes" : { }
}
},
"metadata" : {
"cluster_uuid" : "1TESUYUhRyqeJEQV3Ev-YA",
"templates" : { },
"indices" : { },
"index-graveyard" : {
"tombstones" : [ ]
}
},
"routing_table" : {
"indices" : { }
},
"routing_nodes" : {
"unassigned" : [ ],
"nodes" : {
"Hyv5IVg6SMCimaTZIokn3w" : [ ],
"sIzXX0iNQl-b5JCciAABMQ" : [ ]
}
}
}
【安装elasticsearch-head插件】
上述查看集群的方式,及其不方便,我们可以通过安装elasticsearch-head插件后,来管理集群
###登录14.0.0.77 mode1主机###
上传node-v8.2.1.tar.gz、elasticsearch-head.tar.gz、phantomjs-2.1.1-linux-x86_64.tar.bz2到/opt
yum install gcc gcc-c++ make -y
##编译安装node组件软件包 ##耗时较长
cd /opt
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make -j3
make install
###安装phantomjs###前端框架
cd /opt
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src
cd /usr/local/src/
cd phantomjs-2.1.1-linux-x86_64/bin/
cp phantomjs /usr/local/bin
####安装elasticsearch-head###数据化可视工具
cd /opt
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src
cd /usr/local/src
cd elasticsearch-head/
npm isntall ###npm为随同NodeJS一起安装的包管理工具
####
npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/karma/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression
up to date in 6.619s
####
###修改主配置文件####
vim /etc/elasticsearch/elasticsearch.yml ##下面配置文件,插入末尾
http.cors.enabled: true ##开启跨区域访问支持,默认为false
http.cors.allow-origin: "*" ##跨区域访问允许的域名地址
systemctl restart elasticsearch.service
###启动elasticsearch-head 启动服务器###
cd /usr/local/src/elasticsearch-head
npm run start & ##切换到后台运行
[root@node1 elasticsearch-head]# npm run start &
[1] 9678
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
[root@node1 elasticsearch-head]# netstat -ntap |grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 9688/grunt
[root@node1 elasticsearch-head]# netstat -ntap |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 9757/java
[root@node2 elasticsearch-head]# npm run start &
[1] 112526
[root@node2 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
[root@node2 elasticsearch-head]# netstat -ntap | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 112536/grunt
[root@node2 elasticsearch-head]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 113809/java
[root@node2 elasticsearch-head]# npm run start &
[1] 112526
[root@node2 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
[root@node2 elasticsearch-head]# netstat -ntap | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 112536/grunt
[root@node2 elasticsearch-head]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 113809/java
[root@node2 elasticsearch-head]# npm run start &
[1] 112526
[root@node2 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
[root@node2 elasticsearch-head]# netstat -ntap | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 112536/grunt
[root@node2 elasticsearch-head]# netstat -ntap | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 113809/java
###登录14.0.0.77 node1主机### 索引为index-demo,类型为test,可以看到成功创建
#9100是工具,#9200 ES,-H指定参数类型,-d 指具体数据
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
{
"_index" : "index-demo",
"_type" : "test",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"created" : true
}
####打开浏览器输入HTTP://14.0.0.77:9100/ 查看索引信息####
node1 信息 动作 01234
node2 信息 动作 01234
●上面可以看出索引默认被分为5个,并且有一个副本
点击数据浏览Browser–会发现在node1上创建的索引为index-demo,类型为test,相关的信息
【安装logstash并做一些日志搜索输出到elasticsearch中】
登录主机14.0.0.99
关闭防火墙关闭核心防护
systemctl stop firewalld.service
setenforce 0
1、更改主机名
hostnamectl set-hostname apache
su
2、安装Apache服务(httpd)
yum install httpd -y
systemctl start httpd
3、安装Java环境
java -version ##如果没有装,安装 yum -y install java
4、安装logstash
上传logstash-5.5.1.rpm到/opt目录下
cd /opt
###拖入软件包
rpm -ivh logstash-5.5.1.rpm ###安装logstash
systemctl start logstash.service ###启动logstash
systemctl enable logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ ###建立logstash软链接
5、logstash(Apache)与elasticsearch(node)功能是否正常,做对接测试
logstash这个命令测试
字段描述解释:
-f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
-e 后面跟着字符串,该字符串可以当做logstash的配置(如果是" ",则默认使用stdin作为输入,stdout作为输出)
-t 测试配置文件是否正确,然后退出
6、输入采用标准输入,输出采用标准输出----登录
logstash -e 'input { stdin {} } output { stdout {} }'
......
The stdin plugin is now waiting for input:
16:24:53.883 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
2020-09-15T08:24:53.875Z apache
www.yyc.com ###需要输入www.yyc.com
2020-09-15T08:25:32.717Z apache www.yyc.com
www.baidu.com ###需要输入www.baidu.com
2020-09-15T08:27:36.738Z apache www.baidu.com
.......
7、使用rubydebug显示详细输出,codec为一种编码器
logstash -e 'input { stdin {} } output { stdout { codec=>rubydebug } }'
......
The stdin plugin is now waiting for input:
16:29:47.004 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com ###输入www.baidu.com
{
"@timestamp" => 2020-09-15T08:30:03.137Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
......
###使用logstash将信息写入elasticsearch中##### 输入 输出 对接
logstash -e 'input { stdin {} } output { elasticsearch { hosts=>["14.0.0.77:9200"] } }'
......
The stdin plugin is now waiting for input:
16:33:28.090 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com ###输入内容
......
8、登录192.168.1.112真机
打开浏览器 输入http://14.0.0.77:9100/ 查看索引信息###
多出logstash-2020.09.15
点击 数据浏览 查看响应的内容
【登录14.0.0.99 Apache主机 做对接配置】
###logstash配置文件####
logstash配置文件主要由三部分组成:input、output、filter(根据需要)
##给/var/log/messages 其他 增加读权限
chmod o+r /var/log/messages
[root@apache opt]# ll /var/log/messages
-rw----r--. 1 root root 458094 9月 15 17:03 /var/log/messages
##在/etc/logstash/conf.d/路径下建立一个配置文件systemctl.conf,用来存放/etc/logstash/logstash.yml主配置文件中path.config指定的存放路径的内容
vim /etc/logstash/conf.d/system.conf
input {
file {
path => "/var/log/messages" ###读取的日志文件的路径
type => "system" ###类型
start_position => "beginning" ###从开始行开始读
}
}
output {
elasticsearch { ###数据给ES
hosts => ["14.0.0.77:9200"] ###指定主机名
index => "system-%{+YYYY.MM.DD}" ###指定日期格式
}
}
systemctl restart logstash.service ###重启服务(多启几次)
登录192.168.1.112真机
打开浏览器 输入http://14.0.0.77:9100/ 查看索引信息###
多出system-2020.09.259
做了5个分片,点击索引,查看里面的数据,可以对数据进行操作
登录14.0.0.77 node1主机,安装kibana
###在node1主机安装kibana##
cd /usr/local/src/
##拖入kibana-5.5.1-x86_64.rpm包
rpm -ivh kibana-5.5.1-x86_64.rpm
cd /etc/kibana/
cp -p kibana.yml kibana.yml.bak
vim kibana.yml
2 server.port: 5601 ###kibana打开的端口
7 server.host: "0.0.0.0" ###kibana侦听的地址
21 elasticsearch.url: "http://14.0.0.77:9200" ###和elasticsearch建立联系
30 kibana.index: ".kibana" ###在elasticsearch中添加.kibana索引
systemctl start kibana.service ###启动kibana服务
systemctl enable kibana.service ###开机启动kibana服务
####登录192.168.1.112 真机###
使用浏览器输入14.0.0.77:5601
首次登录创建一个索引名字:system-* ##这是对接系统日志文件
index name or pattern ###下面输入system-*
然后点最下面的create按钮创建
然后点最左上角的discover按钮,会发现system-*信息
然后点下面的host旁边的add,会发现右面的图只有Time 和 host 选项了,这个比较友好
使用浏览器输入14.0.0.77:5601
elasticsearch与kibana建立成功
首次登录创建一个索引名字:system-* (这是对接系统日志文件)
点击discover,system-*所有的信息都在这里
这里可以选择查看各个时间点的日志
然后点下面的host旁边的add,会发现右面的图只有Time 和 host 选项了,这个比较友好
对接Apache主机14.0.0.99的日志文件
(访问的access_log、错误的error_log,要写两个file)
cd /etc/logstash/conf.d/
vim apache_log.conf
input {
file {
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file {
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["14.0.0.77:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["14.0.0.77:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
##不重启直接加载配置文件
/usr/share/logstash/bin/logstash -f apache_log.conf
###登录真机,打开一个新页面访问apache主机的地址14.0.0.99,
打开浏览器输入http://14.0.0.77:9100/ 查看索引信息
能发现 apche_error-2020.09.25 apche_access-2020.09.25
打开浏览器输入http://14.0.0.77:5601
点击左下角有个management选项--index patterns---create index pattern
分别创建apache_error-* 和apache_access-*