从0开始CentOS7上安装ELK实现日志收集
- 1. ELK Stack 简介
- 2. 组件下载
- 2.1 安装环境及版本
- 2.2 下载安装包
- 3.安装
- 3.1 ElasticSearch安装
- 3.1.1 安装JDK
- 3.1.2 安装ElasticSearch
- 3.1.3 设置data的目录
- 3.1.4 设置log的目录
- 3.1.5 修改配置文件elasticsearch.yml
- 3.1.6 启动elasticsearch
- 3.1.7 安装ElasticSearch-Head插件
- 3.1.7.1 安装nodejs、rpm 、git
- 3.1.7.2 下载并安装elasticsearch-head
- 3.1.7.3 修改es-head的localhost地址
- 3.1.7.4 修改head的连接地址
- 3.1.7.5 启动elasticsearch-head
- 3.2 Logstash安装
- 3.2.1 安装logstash
- 3.2.2 设置data的目录
- 3.2.3 设置log的目录
- 3.2.4、设置conf.d的目录,创建配置文件
- 3.2.5 修改配置文件logstash.yml
- 3.2.6 启动logstash
- 3.2.8 logstash指定配置进行运行
- 3.3 kibana安装
- 3.3.1 安装kibana
- 3.3.2 修改kibana.yml
- 3.3.3 启动kibana
- 3.4 配置nginx
- 3.4.1 安装nginx和http用户认证工具
- 3.4.2 修改nginx配置
- 3.5 Filebeat安装
- 3.5.1 安装filebeat
- 3.5.2 启动kibana
- 3.5.3 修改配置Filebeat
- 3.5.4 登录kibana,创建索引,并且搜集数据
- 4. 收集应用日志Demo
- 4.1 修改filebeat.yml配置文件
- 4.2 修改logstash.conf配置文件
- 4.3 测试修改的logstash.conf配置文件
- 4.4 重启相关服务
- 4.5 登录kibana,创建索引
1. ELK Stack 简介
ELK 不是一款软件,而是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELK Stack。根据 Google Trend 的信息显示,ELK Stack 已经成为目前最流行的集中式日志解决方案。
- Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。通常被用作某些应用的基础搜索引擎,使其具有复杂的搜索功能;
- Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
- Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;
- Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder 源代码开发,是对它的替代。在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析。
2. 组件下载
2.1 安装环境及版本
环境 | 版本 |
操作系统 | CentOS7 |
内存 | 4G+ |
ElasticSearch | 7.10.2 |
Logstash | 7.10.2 |
Kibana | 7.10.2 |
Filebeat | 7.10.2 |
Java | openjdk 1.8.0_275 |
2.2 下载安装包
建议把所需安装包手动通过下载工具下载下来,点击进入下载页面,快速下载通道:Elasticsearch、 Logstash、 Kibana、 Filebeat 。
将手动下载的安装包上传至安装机器
3.安装
安装前,关闭防火墙
#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
关闭Seliunx
# 查看
getenforce
# 临时关闭
# 设置SELinux 成为permissive模式
##setenforce 1 设置SELinux 成为enforcing模式
setenforce 0
# 永久关闭
vi /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled,设置后需要重启才能生效
3.1 ElasticSearch安装
3.1.1 安装JDK
已经安装过,可以跳过。
ElasticSearch依赖Java开发环境支持,先安装JDK
yum -y install java-1.8.0-openjdk
查看java安装情况:
java -version
3.1.2 安装ElasticSearch
进入到对应上传的文件夹,安装ElasticSearch
rpm -ivh elasticsearch-7.10.2-x86_64.rpm
查找安装路径:
rpm -ql elasticsearch
一般是装在/usr/share/elasticsearch/下。
3.1.3 设置data的目录
创建/data/es-data目录,用于elasticsearch数据的存放
mkdir -p /data/es-data
修改该目录的拥有者为elasticsearch
chown -R elasticsearch:elasticsearch /data/es-data
3.1.4 设置log的目录
创建/data/es-log目录,用于elasticsearch日志的存放
mkdir -p /log/es-log
修改该目录的拥有者为elasticsearch
chown -R elasticsearch:elasticsearch /log/es-log
3.1.5 修改配置文件elasticsearch.yml
vim /etc/elasticsearch/elasticsearch.yml
修改如下内容:
node.name: node-1
#设置data存放的路径为/data/es-data
path.data: /data/es-data
#设置logs日志的路径为/log/es-log
path.logs: /log/es-log
#设置内存不使用交换分区
bootstrap.memory_lock: false
#配置了bootstrap.memory_lock为true时反而会引发9200不会被监听,原因不明
#设置允许所有ip可以连接该elasticsearch
network.host: 0.0.0.0
#开启监听的端口为9200
http.port: 9200
#增加新的参数,为了让elasticsearch-head插件可以访问es (5.x版本,如果没有可以自己手动加)
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.initial_master_nodes: ["node-1"]
3.1.6 启动elasticsearch
启动
systemctl start elasticsearch
查看状态
systemctl status elasticsearch
设置开机启动
systemctl enable elasticsearch
启动成功之后,测试服务是否开启
curl -X GET http://localhost:9200
返回如下信息,说明安装、启动成功了
3.1.7 安装ElasticSearch-Head插件
3.1.7.1 安装nodejs、rpm 、git
yum install epel-release
yum install nodejs npm git
3.1.7.2 下载并安装elasticsearch-head
git clone https://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
3.1.7.3 修改es-head的localhost地址
cd ./elasticsearch-head #(elasticsearch-head源码文件夹)
vim Gruntfile.js
# Add hostname
connect: {
server: {
options: {
hostname: '0.0.0.0', # add
port: 9100,
base: '.',
keepalive: true
}
}
}
3.1.7.4 修改head的连接地址
cd ./elasticsearch-head #(elasticsearch-head源码文件夹)
vim ./_site/app.js
将localhost修改为ESdeIP地址
修改前:this.base_uri = this.config.base_uri;
# http://loccalhost:9200 中的localhost改为elasticsearch所在机器的地址
修改后: this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://you ip address:9200";
3.1.7.5 启动elasticsearch-head
cd elasticsearch-head(elasticsearch-head源码目录)
./node_modules/grunt/bin/grunt server &
浏览器访问:http://:9200
3.2 Logstash安装
3.2.1 安装logstash
rpm -ivh logstash-7.10.2-x86_64.rpm
3.2.2 设置data的目录
创建/data/ls-data目录,用于logstash数据的存放
mkdir -p /data/ls-data
修改该目录的拥有者为logstash
chown -R logstash:logstash /data/ls-data
3.2.3 设置log的目录
创建/data/ls-log目录,用于logstash日志的存放
mkdir -p /log/ls-log
修改该目录的拥有者为logstash
chown -R logstash:logstash /log/ls-log
3.2.4、设置conf.d的目录,创建配置文件
#进入logstash目录
cd /etc/logstash
#创建conf.d的目录
mkdir conf.d
创建配置文件,日志内容输出到elasticsearch中,如下
vim /etc/logstash/conf.d/logstash.conf
内容如下:
input {
beats {
port => 5044
codec => plain {
charset => "UTF-8"
}
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
3.2.5 修改配置文件logstash.yml
vim /etc/logstash/logstash.yml
内容如下:
# 设置数据的存储路径为/data/ls-data
path.data: /data/ls-data
# 设置管道配置文件路径为/etc/logstash/conf.d
path.config: /etc/logstash/conf.d
# 设置日志文件的存储路径为/log/ls-log
path.logs: /log/ls-log
3.2.6 启动logstash
启动
systemctl start logstash
查看
systemctl status logstash
设置开机启动
systemctl enable logstash
3.2.7、测试logstash--config.test_and_exit
表示,检查测试创建的logstash.conf配置文件,是否有问题,如果没有问题,执行之后,显示Configuration OK 证明配置成功!
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --config.test_and_exit
3.2.8 logstash指定配置进行运行
指定logstash.conf配置文件,以后台的方式运用,执行这段命令之后,需要回车一下
nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf &
检查logstash是否启动
ps -ef|grep logstash
显示如下信息,说明启动了
3.3 kibana安装
3.3.1 安装kibana
rpm -ivh kibana-7.10.2-x86_64.rpm
搜索rpm包
rpm -ql kibana
默认是装在/usr/share/kibana/下。
3.3.2 修改kibana.yml
修改kibana的配置文件
vim /etc/kibana/kibana.yml
内容如下:
#kibana页面映射在5601端口
server.port: 5601
#允许所有ip访问5601端口
server.host: "0.0.0.0"
#elasticsearch所在的ip及监听的地址
elasticsearch.hosts: ["http://localhost:9200"]
3.3.3 启动kibana
启动
systemctl start kibana
查看状态
systemctl status kibana
设置开机启动
systemctl enable kibana
3.4 配置nginx
3.4.1 安装nginx和http用户认证工具
yum -y install epel-release
yum -y install nginx httpd-tools
3.4.2 修改nginx配置
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
vim /etc/nginx/nginx.conf
将location配置部分,注释掉
创建kibana.conf文件
vim /etc/nginx/conf.d/kibana.conf
内容如下:
server {
listen 8000; #修改端口为8000
server_name kibana;
#auth_basic "Restricted Access";
#auth_basic_user_file /etc/nginx/kibana-user;
location / {
proxy_pass http://127.0.0.1:5601; #代理转发到kibana
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
重新加载配置文件
systemctl reload nginx
到这一步,elk基本配置完了,输入如下命令,启动服务
# 启动ELK和nginx
systemctl restart elasticsearch logstash kibana nginx
#查看ELK和nginx启动状态
systemctl status elasticsearch logstash kibana nginx
在浏览器输入ip:8000, 就可以访问了kibana
3.5 Filebeat安装
3.5.1 安装filebeat
yum localinstall -y filebeat-7.10.2-x86_64.rpm
3.5.2 启动kibana
启动
systemctl start filebeat
查看状态
systemctl status filebeat
设置开机启动
systemctl enable filebeat
3.5.3 修改配置Filebeat
编辑filebeat.yml文件
vim /etc/filebeat/filebeat.yml
# ============================== Filebeat inputs ===============================
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: true #更改为true以启用此prospectors配置。
paths: #支持配置多个文件收集目录
#- /var/log/*.log
- /var/log/messages
#==================== Outputs =====================
#------------- Elasticsearch output ---------------
#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
#---------------- Logstash output -----------------
output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
注意:注释掉Elasticsearch output下面的部分,将Filebeat收集到的日志输出到 Logstash output
最后重启服务
systemctl restart filebeat
3.5.4 登录kibana,创建索引,并且搜集数据
ELK+ Filebeat的安装,到此,就基本结束了,以上只是简单的部署完了。
但是,还满足不了需求,我们按需收集日志?Let’s Go!
4. 收集应用日志Demo
Demo日志格式
2021-01-18 00:25:45,702
2021-01-18 00:25:45,702 ----------------仿真开始---------------------
2021-01-18 00:25:45,702
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702 [事件调度] init_entity, 红方机场, entity_init_internal, 仿真初始化:初始化想定, 0.000000, 0.00000
2021-01-18 00:25:45,702
2021-01-18 00:25:45,702 ----------------仿真结束---------------------
2021-01-18 00:25:45,702
该日志存放路径/opt/log/test.log
4.1 修改filebeat.yml配置文件
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /opt/log/test.log # 收集日志目录
4.2 修改logstash.conf配置文件
修改logstash中的配置文件,创建索引,将其输出
vim /etc/logstash/conf.d/logstash.conf
内容如下:
input {
beats {
port => 5044
codec => plain {
charset => "UTF-8"
}
}
}
filter {
if ( '[' not in [message] ) { #如果message字段中有【[】请求,就会删除
drop {}
}
mutate {
split => ["message", "["]
add_field => {
"logtemptime" => "%{[message][0]}"
"logtime" => "%{[message][0]}"
"msgTemp" => "%{[message][1]}"
}
remove_field => "host.name"
remove_field => "@version"
remove_field => "tags"
remove_field => "log.offset"
remove_field => "message"
}
mutate {
split => ["msgTemp", " "]
add_field => {
"operateTopic" => "%{[msgTemp][0]}"
"operate" => "%{[msgTemp][1]}"
"simEntity" => "%{[msgTemp][2]}"
"eventName" => "%{[msgTemp][3]}"
"evevtDesc" => "%{[msgTemp][4]}"
"ctime" => "%{[msgTemp][5]}"
"etime" => "%{[msgTemp][6]}"
}
remove_field => "msgTemp"
}
mutate {
gsub => ["operateTopic", "]", ""]
gsub => ["operate", ",", ""]
gsub => ["simEntity", ",", ""]
gsub => ["eventName", ",", ""]
gsub => ["evevtDesc", ",", ""]
gsub => ["ctime", ",", ""]
}
date {
match => ["logtemptime", "yyyy-MM-dd HH:mm:ss,SSS"]
target => "@timestamp"
locale => "cn"
}
mutate {
remove_field => "logtemptime"
}
}
output{
stdout { codec => rubydebug }
elasticsearch {
hosts => ["localhost:9200"]
index => "testdemo-%{+YYYY.MM.dd}" # 注意index不能包含大写字母,否则报错
}
}
4.3 测试修改的logstash.conf配置文件
输入如下命令,检查/etc/logstash/conf.d/logstash.conf文件,是否配置异常!
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --config.test_and_exit
输入结果,显示Configuration OK,就表示没问题!
4.4 重启相关服务
重启filebeat
systemctl restart filebeat
关闭logstash服务
systemctl stop logstash
有时关不掉
用kill命名强制关闭
ps -ef |grep logstash
# kill -9 <进程ID>
kill -9 27847
以指定的配置文件,启动logstash,输入如下命令,回车就ok了,执行完之后也可以用ps -ef|grep logstash
命令查询logstash是否启动成功!
nohup /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf &
4.5 登录kibana,创建索引
登录kibana,以同样的操作,页面创建索引,查询收集的日志,以下是收集的Demo日志信息