ELK日志系统
一、ELS
1、ELS概念
ELK:是一套完整的日志集中处理方案
E:ElasticSearch ES 分布式索引型非关系数据库 作用:存储logstash输出的日志 全文检索引擎 保存的格式是json格式
L:Logstash 基于java语言开发,作用:数据收集引擎。日志的收集,可以对数据进行过滤、分析、汇总,以标准格式输出。
K:Kiabana 是ElasticSearch的可视化工具,对ES存储的数据进行可视化展示、分析和检索
优点:日志集中管理
ELK F K
F:filebeat 轻量级的开源日志文件数据搜集器,logstash 占用系统资源比较大,属于重量级,有了filebeat可以节省资源,可以通过filebeat好logstash实现远程数据收集,但是filebeat不能对数据进行标准输出,不能输出为es格式的数据,所以需要logstash把filebeat数据做标准化处理
K:kafka 消息队列
2、ELK的工作原理
2.1 在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。
2.2 Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。
2.3 Elasticsearch 对格式化后的数据进行索引和存储。
2.4 Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。
总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。
二、搭建ELK架构
1、安装ELK
192.168.100.11 logstash kibana nginx/http 4/8G
192.168.100.12 es1 2/4G
192.168.100.13 es2 2/4G
bash
一、# test1-1、test1-2、test1-3
systemctl stop firewalld
setenforce 0
yum -y install ntpdate
ntpdate ntp.aliyun.com
date
二、# test1-2 test1-3
1、环境准备
# 设置java环境
yum -y install java
java -version
2、部署 Elasticsearch 软件
(1)#安装elasticsearch---rpm包
cd /opt # 拖elasticsearch-6.7.2.rpm包
rpm -ivh elasticsearch-6.7.2.rpm
(2)#修改elasticsearch主配置文件
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
vim /etc/elasticsearch/elasticsearch.yml
set nu
17 取消注释,指定集群名字 cluster.name: my-elk-cluster
23 取消注释,指定节点名字 Node1节点为node1,Node2节点为node2 #noder1为test1-1的,node2为test1-2的
33 取消注释,指定数据存放路径 path.data: /var/lib/elasticsearch
37 取消注释,指定日志存放路径 path.logs: /var/log/elasticsearch
43 # 保持注释,禁止使用打开空间。取消注释的话,为了避免es使用swap交换分区,bootstrap.memory_lock: true
55 取消注释,设置监听地址,0.0.0.0代表所有地址 network.host: 0.0.0.0
59 取消注释 ELS的默认端口为9200
23行下增加
node.master: true false # test1-1的为true test1-2的为false
node.data: true # test1-1和test1-2的均为true
60行下增加
transport.tcp.port: 9300 # es集群内部通信的端口
73 取消注释 discovery.zen.ping.unicast.hosts: ["192.168.100.12 9300","192.168.100.13 9300"] # 冒号后改为上述冒号后内容
wq!
grep -v "^#" /etc/elasticsearch/elasticsearch.yml # 检查非#以外的配置文件内容
(3)启动elasticsearch,查看是否成功开启
systemctl restart elasticsearch.service
systemctl enable elasticsearch.service
netstat -antp | grep 9200
(4)查看节点信息
浏览器访问 http://192.168.100.12:9200 和 http://192.168.100.13:9200
查看Node1、和Node2的信息
浏览器访问 http://192.168.233.12:9200/_cluster/health?pretty 、 http://192.168.233.13:9200/_cluster/health?pretty查看群集的健康情况,可以看到 status 值为 green(绿色),表示节点健康运行
#使用上述方式查看群集的状态对用户并不友好,可以通过安装 Elasticsearch-head 插件,可以更方便地管理群集。
3、安装 Elasticsearch-head 插件
yum install gcc gcc-c++ make -y # 部署安装环境,node和phantomjs基于java环境运行
(1)编译安装node
cd /opt # 把node-v8.2.1.tar.gz拖进去
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make -j 2 && make install
(2)安装 phantomjs
cd /opt # 把 phantomjs-2.1.1-linux-x86_64.tar.bz2拖进去
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd /opt/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin
(3)安装 Elasticsearch-head 数据可视化工具
cd /opt # 把 elasticsearch-head-master.zip拖进去
unzip elasticsearch-head-master.zip
cd elastic??
cd elasticsearch-head-master/
npm config set registry http://registry.npm.taobao.org/ # 指定为淘宝镜像
npm install # 安装依赖包
(4)修改 Elasticsearch 主配置文件
vim /etc/elasticsearch/elasticsearch.yml
--在末尾行添加一下内容--
http.cors.enabled: true # 开启跨域访问支持,默认为false
http.cors.allow-origin: "*" # 允许跨域访问的域名地址为所有地址
wq!
systemctl restart elasticsearch
netstat -antp | grep 9200
(5)启动 elasticsearch-head 服务
cd /opt/elasticsearch-head-maste
npm run start &
# 会出现很长一串,最后是9100,表示elasticsearch-head 监听的端口是 9100
netstat -natp |grep 9100
(6)通过 Elasticsearch-head 查看 Elasticsearch 信息
浏览器访问192.168.100.12:9100和192.168.100.13:9100 把localhost换成ip地址,集群健康值显示为绿色表示成功
(7)插入索引
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
三、# test1-1
1、ELK Logstash部署
(1)安装Apahce服务(httpd)
yum -y install httpd
systemctl start httpd
(2)安装Java环境
yum -y install java
java -version
(3)安装logstash
cd /opt # 把 logstash-6.7.2.rpm 拖进去
rpm -ivh logstash-6.7.2.rpm
systemctl start logstash.service
systemctl enable logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
# logstash的默认工作目录为:/etc/logstash/conf.d 在配置文件中为path.config: /opt/log,也可以指定logstash的工作目录,在配置文件中修改
(4)测试 Logstash
logstash -e 'input { stdin{} } output { stdout{} }'
# 出现很大一长串,只要结尾出现Successfully和端口9600即成功,可以在里面输入
# www.baidu.com
# www.sina.com.cn
# www.google.com
## 实例通过正常,ctrl+z结束
(5)修改Logstash到Elasticsearch模块
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.12:9200","192.168.100.13:9200"] } }' --path.data /opt/test1
## 出现很大一长串,只要结尾出现Successfully和端口代表成功
# www.baidu.com
# www.sina.com.cn
# www.google.com
## 此时没有标准输出的实例,实例到Elasticsearch模块
(6)
回到浏览器访问的页面,刷新,出现Logstash-2024.08.01模块
2、创建日志收集系统
test1-1
cd /etc/logstash/conf.d # cond.d工作目录
vim system.conf
input {
file{
path =>"/var/log/messages"
type =>"system"
start_position =>"beginning"
# 从结尾开始end
}
}
output {
elasticsearch {
hosts =>["192.168.100.12:9200","192.168.100.13:9200"]
index =>"system-%{+YYYY.MM.dd}"
}
}
wq!
cat system.conf
chmod 777 /var/log/messages
logstash -f system.conf --path.data /opt/test2 &
# 后台运行回车即可
3、安装kibana
test1-1
cd /opt # 拖包
rpm -ivh kibana-6.7.2-x86_64.rpm
vim /etc
2 取消注释
7 localhost改0.0.0.0
28 取消注释 elasticsearch.hosts: ["http://192.168.100.12:9200","192.168.100.13:9200"]
96 取消注释 日志路径 logging.dest: stdout改logging.dest: /var/log/kibana.log
113 取消注释 i18n.locale: "en"改为i18n.locale: "zh-CN" 表示使用中文
37 取消注释 打开索引名称
wq!
touch /var/log/kibana.log
chown kibana.kibana /var/log/kibana.log
systemcl restart kibana
systemcl enable kibana
netstat -antp | grep 5601
页面访问192.168.100.11:5601
管理------索引管理------索引模式------创建索引------输入"system-*"------下一步------字段选择"@timestamp"------创建索引模式------点击左栏中的"discover"可查看日志信息
2、补充内容
node
:基于谷歌浏览器的运行环境
phantmjs
:虚拟浏览器
es-head-master
:es的独立可视化工具,可以实现分片索引数据的可视化展示
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.12:9200","192.168.100.13:9200"] } }'
1、es的主从和数据模式
node.master:true
:es数据库的主从类型,主是true,非主就是false
es如何创建、修改、删除数据、数据管理?
通过http的方式
post方式修改数据
创建数据命令
bash
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
localhost:9200
:对应的就是本地数据库的地址,可以是ip+端口
index-demo
:创建索引分片的名称
test
:数据的名称
1
:数据的id字段
?pretty&pretty
:参数设定为json格式
-d
:后面跟数据的具体内容
'{"user":"zhangsan","mesg":"hello world"}'
:表示真正的数据内容
修改数据命令
bash
curl -X POST 'localhost:9200/index-demo/test/1/_update?pretty' -H 'Content-Type: application/json' -d '{"doc": {"user": "zhangsan","mesg":"hello1 world1"} }'
删除数据命令
bash
curl -X DELETE 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello1 world1"}'
3、收集业务日志
bash
# test1-1
cd /etc/logstash/conf.d
vim http.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.100.12:9200","192.168.100.13:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.100.12:9100","192.168.100.13:9100"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
logstash -f http.conf --path.data /opt/test数字 & # 可以查看一下/opt目录,创建一个没有的test数字
API接口:软件内部代码之间通信的接口,代码的连接,代码之间的内部端口
端口是对外提供访问程序的内容结构
4、filebeat收集业务日志
nginx1 192.168.100.10
bash
# nginx1
1、关闭防火墙和访问nginx
systemctl restart nginx
systemctl stop firewalld
setenforce 0
curl 192.168.100.10
2、安装filebea软件
cd /opt # 拖包filebeat-6.7.2-linux-x86_64.tar.gz
tar -xf filebeat-6.7.2-linux-x86_64.tar.gz
mv filebeat-6.7.2-linux-x86_64 /usr/local/filebeat
cd /usr/local/filebeat
cp filebeat.yml filebeat.yml.bak
3、修改filebea.yml配置文件
vim filebeat.yml
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
#开启日志收集,以及确定日志文本的路径
#指定标签和发送到目标主机的logstash
tags: ["nginx"]
fielsd:
service_name:192.168.100.10_nginx
log_type:nginx
from:192.168.100.10
一直往下
#output.elasticsearch:
#Array of hosts to connect to.
#hosts: ["localhost:9200"]
output.logstash:
# The Logstash hosts
hosts: ["192.168.100.11:5055"]
#5044是logstash默认的端口,只要是logstash主机上没有被占用的端口都可以,netstat -antp | grep 5055 查看一下
wq!
# test1-1
cd /etc/logstash/conf.d
vim nginx_10.conf
input {
beats { port => "5045"}
}
output {
if "nginx" in [tags] {
elasticsearch {
hosts => ["192.168.100.12:9200","192.168.100.13:9200"]
index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
}
}
wq!
先开启filebeat,开启logstash!
# nginx1
cd /usr/local/filebeat
nohup ./filebeat -e -c filebeat.yml > filebeat.out &
------------------------------------------------------------------------------------------------------------
-e 输出到标准输出
-c 指定配置文件
nohup 在系统的后台运行,不会因为终端的关闭导致程序停止运行
可以把运行的日志保存到指定文件
# test1-1
logstash -f http.conf --path.data /opt/test数字 & # 创建一个/opt下没有的
filebeat作用:
1、可以在本机收集日志
2、也可以远程收集日志
3、轻量级的日志收集系统,可以在非java环境运行
logstash是在jvm环境中运行,资源消耗很大,启动一个logstash要消耗500M左右的内存,filebeat只消耗10M左右的内存
7、实验:在mysql上yum安装httpd和nginx、filebeat
mysql1-7 192.168.100.17
bash
# mysql1-7
systemctl stop firewalld
setenforce 0
vim /etc/my.cnf
# 开启mysql二进制文件
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
wq!
systemctl restart mysqld
修改nginx或httpd的端口
curl 192.168.100.17:85 # 测试httpd访问,端口修改为85
curl 192.168.100.17 # 测试nginx访问
mysql -u root -p123456 # 测试mysqld访问
cd /opt # 把filebeat-6.7.2-linux-x86_64.tar.gz的包拖进去
tar -xf filebeat-6.7.2-linux-x86_64.tar.gz
mv filebeat-6.7.2-linux-x86_64 /usr/local/filebeat
cd /usr/local/filebeat
cp filebeat.yml filebeat.yml.bak
修改filebeat.yml配置文件
vim filebeat.yml
- type: log
enabled: true
paths:
- /etc/httpd/logs/access_log
- /etc/httpd/logs/error_log
tags: ["httpd"]
fielsd:
service_name:192.168.100.17_httpd
log_type:httpd
from:192.168.100.17
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
tags: ["nginx"]
fielsd:
service_name:192.168.100.17_nginx
log_type:nginx
from:192.168.100.17
- type: log
enabled: true
paths:
- /usr/local/mysql/data/mysql_general.log
tags: ["mysqld"]
fielsd:
service_name:192.168.100.17_mysqld
log_type:mysqld
from:192.168.100.17
一直往下
output.elasticsearch: # 注释 #output.elasticsearch:
#Array of hosts to connect to.
hosts: ["localhost:9200"] # 注释 #hosts: ["localhost:9200"]
#output.logstash: # 取消注释 output.logstash:
# The Logstash hosts
#hosts: ["localhost:5044"] # 取消注释 hosts: ["192.168.100.11:5055"]
#5044是logstash默认的端口,只要是logstash主机上没有被占用的端口都可以,netstat -antp | grep 5055 查看一下
wq!
# test1-1
cd /etc/logstash/conf.d
vim hnm.conf #注意需要以.conf为结尾
input {
beats { port => "5055"}
}
output {
if "httpd" in [tags] {
elasticsearch {
hosts => ["192.168.100.12:9200","192.168.100.13:9200"]
index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
}
if "nginx" in [tags] {
elasticsearch {
hosts => ["192.168.100.12:9200","192.168.100.13:9200"]
index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
}
if "mysqld" in [tags] {
elasticsearch {
hosts => ["192.168.100.12:9200","192.168.100.13:9200"]
index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
}
}
wq!
# mysql1-7
cd /usr/local/filebeat
nohup ./filebeat -e -c filebeat.yml > filebeat.out &
# test1-1
logstash -f hnm.conf --path.data /opt/test数字 &
# mysql1-7
tail -f filebeat.out
浏览器访问192.168.100.12:9100 和 192.168.100.12:9100。刷新,出现192.168.100.17_httpd-当前日期、192.168.100.17_nginx-当前日期、192.168.100.17_mysqld-当前日期
# kibana
http://192.168.100.11:5601/
管理--索引模式--创建索引模式--索引模式--下一步--@timestamp--创建索引模式--discovery--访问httpd或者nginx或者mysqld:日志更新