目录
一、 ELK日志分析系统简介
日志服务器
- 提高安全性
- 集中存放日志
- 缺陷
对日志的分析困难
ELK日志分析系统
- Elasticsearch
- Logstash
- Kibana
日志处理步骤
- 1.将日志进行集中化处理
- 2.将日志格式化(Logstsh)并输出到Elasticsearch
- 3.对格式化后的数据进行索引和存储(Elasticsearch)
- 4.前端数据的展示(Kibana)
二、Elasticsearch介绍
Elasticsearch的概述
- 提供了一个分布式多用户能力的全文搜索引擎
Elasticsearch核心概念
- 接近实时
- 集群
- 节点
- 索引
索引(库)—>类型(表)—>文档(记录) - 分片和副本
四、Kibana介绍
Kibana介绍
- 一个针对ELasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引中的数据
- 通过各种图表进行高级数据分析及展示
Kibana主要功能
- Elasticsearch无缝之集成
- 整合数据,复杂数据分析
- 让更多团队成员受益
- 接口灵活,分享更容易
- 配置简单,可视化多数据源
- 简单数据导出
五、部署ELK日志分析系统
案例拓扑图
需求描述
配置ELK日志分析群集
使用Logstash
使用Kibana乍看分析日志
设备列表
主机 | 操作系统 | 主机名/IP地址 | 主要软件 |
---|---|---|---|
服务器 | CentOS7.3 | Node1/192.168.91.10 | Elasticsearch、Kibana |
服务器 | CentOS7.3 | Node2/192.168.91.20 | Elasticsearch |
服务器 | CentOS7.3 | Apache/192.168.91.30 | Logstash、Apache |
准备安装环境
关闭防火墙和Selinux
Node1、Node2节点内存分配4G,Apache节点分配1G内存
通过VMware虚拟网络Vmnet8网络连接
具体部署过程
配置node1、node2
###登录192.168.91.10 更改主机名 配置域名解析 查看Java环境###
[root@location ~]# hostnamectl set-hostname node1
[root@location ~]# su
[root@location ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# setenforce 0
安装elasticsearch
[root@node1 ~]# vi /etc/hosts
192.168.91.10 node1
192.168.91.20 node2
[root@node1 ~]# cd /opt/elk
[root@node1 elk]# rpm -ivh elasticsearch-5.5.0.rpm
加载系统服务
[root@node1 elk]# systemctl daemon-reload
[root@node1 elk]# systemctl enable elasticsearch.service
修改ELasticsearch配置文件
[root@node1 elk]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak '//复制一份备份文件'
[root@node1 elk]# 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 elk]# 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: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
创建数据存放路径并授权
[root@node1 elk]# mkdir -p /data/elk_data
[root@node1 elk]# chown elasticsearch:elasticsearch /data/elk_data/
启动elasticsearch是否成功开启
[root@node1 elk]# systemctl start elasticsearch.service
[root@node1 elk]# netstat -anptu | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 5715/java
查看节点信息,用真机192.168.91.10的浏览器打开http://192.168.91.10:9200/
{
"name" : "node1",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "7BztY_8bQFSWHdrykRbTDw",
"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"
}
查看节点信息,用真机192.168.91.20的浏览器打开http://192.168.91.10:9200/
{
"name" : "node2",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "7BztY_8bQFSWHdrykRbTDw",
"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"
}
集群检查健康与状态(node1、node2)
查看健康192.168.91.10: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
}
查看状态192.168.91.10:9200/_cluster/state?pretty
{
"cluster_name" : "my-elk-cluster",
"version" : 6,
"state_uuid" : "ZUdJ3zl_SdGNvojaHfxifA",
"master_node" : "M6gRPmGTQZCsA3c4TjrMpQ",
"blocks" : { },
"nodes" : {
"fXvs7sVhTkKOLgqSCFt_bw" : {
"name" : "node1",
"ephemeral_id" : "1OsaMQvhTv6yacqF3o-3XA",
"transport_address" : "192.168.91.10:9300",
"attributes" : { }
},
"M6gRPmGTQZCsA3c4TjrMpQ" : {
"name" : "node2",
"ephemeral_id" : "em66iSy7QqGwEn25gZkOTg",
"transport_address" : "192.168.91.20:9300",
"attributes" : { }
}
},
"metadata" : {
"cluster_uuid" : "7BztY_8bQFSWHdrykRbTDw",
"templates" : { },
"indices" : { },
"index-graveyard" : {
"tombstones" : [ ]
}
},
"routing_table" : {
"indices" : { }
},
"routing_nodes" : {
"unassigned" : [ ],
"nodes" : {
"M6gRPmGTQZCsA3c4TjrMpQ" : [ ],
"fXvs7sVhTkKOLgqSCFt_bw" : [ ]
}
}
}
安装node组件依赖包(node1、node2)
[root@node1 ~]# cd /opt/elk/
[root@node1 elk]# yum -y install gcc gcc-c++
[root@node1 elk]# tar zxvf node-v8.2.1.tar.gz
[root@node1 elk]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j3
[root@node1node-v8.2.1]# make install
安装phantomjs前端框架(node1、node2)
[root@node1 ~]# cd /opt/elk/
[root@node1 elk]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src
[root@node1 elk]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin
安装Elasticsearch-head数据可视化工具(node1、node2)
[root@node1 ~]# cd /opt/elk/
[root@node1 elk]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
[root@node1 elk]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
修改Elasticsearch主配置文件(node1、node2)
[root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
...
http.cors.enabled: true '//开启跨域访问支持,默认为false'
http.cors.allow-origin: "*" '//跨域访问允许的域名地址'
[root@node1 elasticsearch-head]# systemctl restart elasticsearch
启动Elasticsearch-head 启动服务器(node1、node2)
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start & '//切换到后台运行'
[1] 59396
[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 -antp | grep 9200
[root@node1 elasticsearch-head]# netstat -antp | grep 9100
真机浏览器输入20.0.0.10:9100、20.0.0.20:9100
在location处输入http://192.168.91.10:9200/可以看到群集健康状态是绿色的,以及两个节点
新建索引
加粗的是主文件的,细框的是备份文件,不论哪个节点宕机,存储都不会丢失,很安全,一个节点有五个分片,两个节点共10个分片d
测试
#192.168.91.10
#插入一个数据进行测试
[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
}
刷新一下,可以看到存储的分片处理与备份,暂时不存在节点间的主备关系。
配置logstash-apache
#更改主机名
[root@location ~]# hostnamectl set-hostname apache
#关闭防火墙与核心防护
[root@apache ~]# setenforce 0
[root@apache ~]# systemctl stop firewalld
#安装Apache服务(httpd)
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
[root@apache ~]# systemctl status httpd
[root@apache ~]# ll /etc/httpd/logs/
总用量 4
-rw-r--r--. 1 root root 0 1月 7 01:02 access_log
-rw-r--r--. 1 root root 929 1月 7 01:02 error_log
#安装Java环境
[root@apache ~]# java -version '//没有安装需要yum -y install java'
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
#安装logstash
#上传软件包到/opt/目录下
[root@apache elk]# cd /opt/elk
[root@apache elk]# rpm -ivh logstash-5.5.1.rpm '//安装logstash'
[root@apache elk]# systemctl start logstash.service '//启动logstash'
[root@apache elk]# systemctl enable logstash.service '//设置开启自启'
[root@apache elk]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ '//建立软连接'
logstash(apache)与elasticsearch(node)功能是否正常,做对接测试
logstash这个命令测试
字段描述
-f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
-e 后面跟着字符串该字符串可以被当作logstash的配置(如果是" ",则默认使用stdin作为输入,stdout作为输出)
-t 测试配置文件是否正确,然后退出
测试
1.在apache服务器上—输入采用标准输入 输出采用标准输出
[root@apache elk]# logstash -e 'input { stdin {} } output { stdout {} }'
...
www.baidu.com
2021-01-07T02:12:31.001Z apache www.baidu.com
2.用rubydebug显示详细输出,codec为一种编解码器
[root@apache elk]# logstash -e 'input { stdin {} } output { stdout { codec=>rubydebug } }'
...
www.baidu.com
{
"@timestamp" => 2021-01-07T02:13:44.085Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
3.使用logstash将信息写入elasticsearch中—输入输出对接
[root@apache elk]# logstash -e 'input { stdin {} } output { elasticsearch { hosts=>["主节点IP地址:9200"] } }'
...
www.baidu.com
‘//浏览器里面输入:"主节点IP:9100"会显示www.baidu.com’
logstash配置文件
logstash配置文件主要由三部分组成:input、output、filter(根据需求)
[root@apache elk]# chmod o+r /var/log/messages
[root@apache elk]# ll /var/log/messages
[root@apache elk]# vim /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch{
hosts => ["192.168.91.10:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
[root@apache elk]# systemctl restart logstash.service
#node1上重启elasticsearch
[root@node1 elasticsearch-head]# systemctl restart elasticsearch.service
‘//浏览器输入"主节点IP:9100"查看信息"/var/log/messages’
安装kibana(node1)
安装kibana
上传软件包到/opt/目录下
[root@node1 ~]# cd /opt/elk
[root@node1 elk]# rpm -ivh kibana-5.5.1-x86_64.rpm '//安装rpm包'
[root@node1 elk]# cd /etc/kibana/
[root@node1 kibana]# cp -p kibana.yml kibana.yml.bak '//备份'
[root@node1 kibana]# vim /etc/kibana/kibana.yml
2//server.port: 5601 '//打开kibana端口'
7//server.host: "0.0.0.0" '//kibana监听地址---监听所有'
21//elasticsearch.url: "http://主节点IP:9200" '//与elasticsearch建立连接'
30//kibana.index: ".kibana" '//在elasticsearch中添加.kibana索引---测试使用'
[root@node1 kibana]# systemctl start kibana.service '//启动kibana服务'
[root@node1 kibana]# systemctl enable kibana.service '//设置开机自启'
访问192.168.91.10:5601进行查看视图
Discover里查看日志,图表式显示
logstash对接apache日志文件(Apache服务器)
#logstash-apache
[root@Apache ~]# cd /etc/logstash/conf.d
[root@Apache ~]# 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 => ["192.168.91.10:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch{
hosts => ["192.168.91.10:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@Apache ~]# /usr/share/logstash/bin/logstash -f apache_log.conf '//重启服务也可以'
刷新ES网页,查看索引,建议先访问apache页面,否则可能刷新不出来
在kibana创建Apache索引图表
查看正确的和错误的访问日志,记得切换时间,不然有可能会显示无内容