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
- 一、# 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方式修改数据
创建数据命令
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"}' :表示真正的数据内容
修改数据命令
curl -X POST 'localhost:9200/index-demo/test/1/_update?pretty' -H 'Content-Type: application/json' -d '{"doc": {"user": "zhangsan","mesg":"hello1 world1"} }'
删除数据命令
curl -X DELETE 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello1 world1"}'
3、收集业务日志
- # 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
- # 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
- # 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:日志更新