文章目录
ELK日志分析系统概述
ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。
由于服务器中的日志数量十分的庞大,在对日志分析的时候十分困难,使用ELK日志分析系统可以将日志可是化,简化对日志放分析。
Elasticsearch
提供了一个分布式多用户能力的全文搜索引擎
Elasticsearch核心概念
- 接近实时
- 集群
- 节点
- 索引
- 索引(库)→类型(表)→>文档(记录)
- 分片和副本
Logstash
一款强大的数据处理工具,可实现数据传输、格式处理、格式化输出,数据输入、数据加工(如过滤,改写等)以及数据输出
LogStash主要组件
- Shipper
- Indexer
- Broker
- Search and Storage
- Web Interfare
Kibana
一个针对Elasticsearch的开源分析及可视化平台,搜索、查看存储在Elasticsearch索引中的数据,通过各种图表进行高级数据分析及展示
Kibana主要功能
- Elasticsearch无缝之集成
- 整合数据,复杂数据分析
- 让更多团队成员受益
- 接口灵活,分享更容易
- 配置简单,可视化多数据源
- 简单数据导出
ELK日志分析系统架构
ELK的架构拓扑如下:
ELK日志分析系统
- Elasticsearch
- Logstash
- Kibana
日志处理步骤
1.将日志进行集中化管理
2.将日志格式化(Logstash)并输出到Elasticsearch
3.对格式化后的数据进行索引和存储(Elasticsearch)
4.前端数据的展示(Kibana)
ELK配置案例
本次配置中使用四台设备进行
案例环境
案例配置拓扑如下:
主机 | ip | 系统 | 安装软件 |
---|---|---|---|
elasticsearch+kibana | 20.0.0.31 | centos7.6 | elasticsearch-5.5.0.rpm+kibana-5.5.1-x86_64.rpm,管理工具node-v8.2.1.tar.gz,elasticsearch-head.tar.gz ,phantomjs-2.1.1-linux-x86_64.tar.bz2 |
elasticsearch | 20.0.0.61 | centos7.6 | elasticsearch-5.5.0.rpm,管理工具node-v8.2.1.tar.gz,elasticsearch-head.tar.gz ,phantomjs-2.1.1-linux-x86_64.tar.bz2 |
logstash +Apache | 20.0.0.21 | centos7.6 | logstash-5.5.1.rpm,httpd |
访问端 | 20.0.0.88 | window10 | 浏览器 |
配置大致过程
- elasticsearch配置
- 管理工具node-v8.2.1.tar.gz elasticsearch-head.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2
- logstash 配置
- kibana配置
- 浏览器访问kibana
配置步骤
配置前准备
1.修改主机名
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# su
2.修改hosts配置文件
[root@node1 ~]# vim /etc/hosts
在末尾添加
20.0.0.31 node1
20.0.0.61 node2
查看系统Java环境
[root@node1 ~]# 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)
3.各节点防火墙要设置下
[root@node2 elasticsearch]# iptables -F
[root@node2 elasticsearch]# setenforce 0
[root@node2 elasticsearch]# systemctl stop firewalld
部署ES(对logstash收集的日志建立索引信息方便查找)
1.安装ES
安装包准备
如果用xshell6的话安装过lrzsz(yum安装即可)就可以直接从寄主机中拖到xshell即可
如果不行请看共享文件
[root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm
警告:elasticsearch-5.5.0.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中... ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
正在升级/安装...
1:elasticsearch-0:5.5.0-1 ################################# [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
sudo systemctl start elasticsearch.service
2.加载系统服务
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
3.修改elasticsearch配置文件
[root@node1 etc]# cd /etc/elasticsearch/
[root@node1 elasticsearch]# cp -p elasticsearch.yml elasticsearch.yml.bak
#前面的数字为行号,这个是群集名称
17 cluster.name: my-elk-cluster
#当前服务器节点名称
23 node.name: node1
#数据存放位置
33 path.data: /data/elk_data
#ES服务器日志存放位置
37 path.logs: /var/log/elasticsearch
#内存不锁
43 bootstrap.memory_lock: false
#监听地址
55 network.host: 0.0.0.0
#服务端口
59 http.port: 9200
#群集发现通过单播实现
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
4.创建在配置文件中声明的数据文件存放位置
[root@node1 elasticsearch]# mkdir -p /data/elk_data
[root@node1 elasticsearch]# chown elasticsearch.elasticsearch /data/elk_data/
4.启动elasticsearch
[root@node1 elasticsearch]# systemctl start elasticsearch.service
[root@node1 elasticsearch]# netstat -antp |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 12256/java
从服务器node2也是这样配置的,具体的配置文件为
#前面的数字为行号,这个是群集名称
17 cluster.name: my-elk-cluster
23 node.name: node2
33 path.data: /data/elk_data
37 path.logs: /var/log/elasticsearch
43 bootstrap.memory_lock: false
55 network.host: 0.0.0.0
59 http.port: 9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
5.查看节点信息
浏览器访问20.0.0.31:9200 20.0.0.61:9200
7.查看节点的健康状态
http://20.0.0.31:9200/_cluster/health?pretty
8.查看节点状态
http://20.0.0.31:9200/_cluster/state?pretty
Elasticsearch安装管理工具
1.准备环境
[root@node1 ~]# yum -y install gcc gcc-c++
2.上传软件包
3.解压node
[root@node1 ~]# tar zxvf node-v8.2.1.tar.gz
[root@node1 ~]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
指定处理的核心数3,多点快,这里等待时间较长20分钟以上
[root@node1 node-v8.2.1]#make -j3
[root@node1 node-v8.2.1]# make install
4.解压phantomjs前端组件
[root@node1 ~]# tar jxvf phantomjs-2.1.1-linux-x86_64
[root@node1 ~]# cd phantomjs-2.1.1-linux-x86_64/bin/
[root@node1 bin]# ls
phantomjs
[root@node1 bin]# cp phantomjs /usr/local/bin/
5.解压elasticsearch-head数据可视化管理工具
[root@node1 ~]# tar zxvf elasticsearch-head.tar.gz
[root@node1 ~]# cd elasticsearch-head/
[root@node2 elasticsearch-head]# npm install
6.修改elasticsearch配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
7.启动elasticsearch-head管理工具
[root@node1 ~]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
[1] 58381
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /root/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 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 58391/grunt
如果查看9200端口没有的话,重启下elasticsearch再等 一会儿
[root@node1 elasticsearch-head]# netstat -antup |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 58445/java
node2也这样配置启动服务
8.浏览器访问
http://20.0.0.31:9100/
创建一个索引
我们可以看到5个分片1个副本,有副本和分布式的结构在里面,具有可靠性和高可用性
我们也可以在我们elasticsearch上添加索引信息和查看
这条命令就是向本地elasticsearch中的index-demo索引中插入类型为test 数据格式为json内容为相应内容的数据
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"HI"}'
插入数据后也可以在浏览器中看到
我们就可以看到我们插入的数据,在这里index可以想象成数据库的数据库,而type可以看成是表
部署logstash(收集日志给ES)
1.更改主机名
[root@localhost ~]# hostnamectl set-hostname apache
[root@localhost ~]# su
[root@apache ~]#
2.防火墙配置
[root@apache ~]# iptables -F
[root@apache ~]# setenforce 0
[root@apache ~]# systemctl stop firewalld
3.安装Apache服务
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
4.安装Java环境(系统自带的就可以)
[root@apache ~]# java -version
openjdk version "1.8.0_222-ea"
OpenJDK Runtime Environment (build 1.8.0_222-ea-b03)
OpenJDK 64-Bit Server VM (build 25.222-b03, mixed mode)
5.安装logstash
将安装包放到虚拟机中,使用rpm安装即可
[root@apache ~]# rpm -ivh logstash-5.5.1.rpm
警告:logstash-5.5.1.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:logstash-1:5.5.1-1 ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
Successfully created system startup script for Logstash
启动
[root@apache ~]# systemctl start logstash.service
[root@apache ~]# systemctl enable logstash.service
命令可被系统识别
[root@apache ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
logstash命令
-f 可以指定logstash的配置文件,
-e 后面可跟着字符串 该字符串可以被单做logstash的配置(如果是"",则默认使用stdin作为输入,stdout作为输出)
logstash(相当于一个管道)作为日志收集自然需要日志的输入,在格式化处理后输出到ES或者是控制台
-t 测试配置文件是否正确
6.标准输入输出(输入输出)
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{} }'
#标准输入
www.baidu.com
#标准输出
2020-09-15T01:34:12.979Z apache www.baidu.com
www.sina.com
2020-09-15T01:34:28.255Z apache www.sina.com
7.使用特定格式输出(格式化输出)
以rubydebug的格式输出
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug} }'
#标准输入
www.baidu.com
#格式化输出
{
"@timestamp" => 2020-09-15T01:38:08.855Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
8.logstash与ES对接
[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch {hosts=>["20.0.0.31:9200"]} }'
#标准输入
www.baidu.com
#输出到ES服务器上
到elasticsearch服务器上看
在ES上可以看到
9.logstash收集系统日志对接ES
logstash配置文件的三部分:output input filter
使用系统日志文件测试
[root@apache ~]# chmod o+r /var/log/messages
[root@apache ~]# ll /var/log/messages
-rw----r--. 1 root root 537813 9月 15 09:48 /var/log/messages
在子配置文件下创建配置文件
[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache conf.d]# vim system.conf
#输入
input {
file{
#需要收集的日志存放的位置
path => "/var/log/messages"
#类型是方便ES建索引的
type => "system"
#日志中读取的起始位置,beginning表示从头
start_position => "beginning"
}
}
#输出到ES上
output {
elasticsearch {
hosts => ["20.0.0.31:9200"]
#建立索引的格式
index => "system-%{+YYYY.MM.dd}"
}
}
[root@apache conf.d]# systemctl restart logstash.service
可在浏览器上看到信息了
部署kibana(node1)
1.安装包
[root@node1 ~]# rpm -ivh kibana-5.5.1-x86_64.rpm
警告:kibana-5.5.1-x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:kibana-5.5.1-1 ################################# [100%]
2.配置文件修改
[root@node1 ~]# cd /etc/kibana/
[root@node1 kibana]# cp -p kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml
#前面的数字为行号
#监听端口
2:server.port: 5601
#监听地址
7:server.host: "0.0.0.0"
#elasticsearch服务器地址
21:elasticsearch.url: "http://20.0.0.31:9200"
#在ES中建kibana索引,查看ES上的索引,这样就可以知道二者是否建立连接
30:kibana.index: ".kibana"
3.启动服务
[root@node1 kibana]# systemctl stop kibana.service
[root@node1 kibana]# systemctl start kibana.service
4.浏览器访问
http://20.0.0.31:5601/就可以看到kibana的页面了,功能能十分强大,可查看过去非常精确的时间段的日志
Apache日志分析
logstash收集Apache日志
[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache 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 => ["20.0.0.31:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["20.0.0.31:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# logstash -f apache_log.conf
等待一会
浏览器访问elasticsearch
http://20.0.0.31:9100/
浏览器访问http后会生成access日志,再访问kibana
20.0.0.31:5601访问kibana
在kibana中创建索引apache_access和apache_error
即可查看到相应的日志