elk+filebeat
elk +filebeat+kafka
一: ELK企业级日志分析系统
1.1 ELK 简介
ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。
- ElasticSearch
- ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。
- Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与 Elasticsearch 通信。
- Elasticsearch 是个分布式搜索和分析引擎,优点是能对大容量的数据进行接近实时的存储、搜索和分析操作。
- Logstash:
- Logstash:作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。
- Logstash 由JRuby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具, 可以实现数据传输、格式处理、格式化输出。Logstash 具有强大的插件功能,常用于日志处理。
- Kiabana:
- Kiabana:是基于 Node.js 开发的展示工具,可以为 Logstash 和 ElasticSearch 提供图形化的日志分析 Web 界面展示,可以汇总、分析和搜索重要数据日志。
- Filebeat:
- Filebeat:轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进行解析,或是直接发给 Elasticsearch 存储,性能上相比运行于 JVM 上的 logstash 优势明显,是对它的替代。
1.2 为什么使用ELK
- 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
- 往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
- 一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
1.3 完整日志系统基本特征
- 收集:能够采集多种来源的日志数据
- 传输:能够稳定的把日志数据解析过滤并传输到存储系统
- 存储:存储日志数据
- 分析:支持 UI 分析
- 警告:能够提供错误报告,监控机制
1.4 ELK的工作原理
- 在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。
- Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。
- Elasticsearch 对格式化后的数据进行索引和存储。
- Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。
二:elk集群之部署elasticsearch集群部署
主机 | 角色 |
---|---|
Node1节点(2c/4G) :node1:192.168.23.11 | Elasticsearch ; Kibana |
Node2 节点(2c/4G):node2:192.168.23.12 | Elasticsearch |
Apache节点: apache:192.168.23.13 | Logstash ; Apache |
2.1 环境准备
更改主机名,配置域名解析,查看java哦环境
复制[root@node1 opt]# systemctl stop firewalld
[root@node1 opt]# setenforce 0
---------------------------
#修改主机名
Node1 节点: hostnamectl set-hostname node1
Node2 节点: hostnamectl set-hostname node2
#node1,node2配置主机名映射
echo "192.168.23.11 node1" >> /etc/hosts
echo "192.168.23.12 node2" >> /etc/hosts
----------------
node1,node2查看java环境
[root@node1 ~]# 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)
2.2 部署elasticsearch 软件
复制#安装 elasticsearch-rpm 包
#上传elasticsearch-5.5.0.rpm 到/opt目录下
cd /opt
rpm -ivh elasticsearch-5.5.0.rpm
#加载系统服务
systemctl daemon-reload
systemctl enable eelasticsearch.service
2.2.1 修改elasticsearch 主配置文件
复制[root@node1 opt]#cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsrch.yml.bak
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
[root@node1 opt]# grep -nv "^#" /etc/elasticsearch/elasticsearch.yml
#17行,取消注释,指定集群名
17:cluster.name: my-elk-cluster
#23行:取消注释,指定节点名。node1节点为node1,node2节点为node2
23:node.name: node1
#33行:取消注释,指定数据存放路径(/data/elk_data目录需要自己创建)
33:path.data: /data/elk_data
#37行:取消注释,指定日志存放路径
37:path.logs: /var/log/elasticsearch/
#43: 取消注释,改为在启动时不锁定内存
#内存锁:在启动时预估需要多少内存,然后将这些内存锁定,其他服务就无法使用这些内存.
43:bootstrap.memory_lock: false
#55: 取消注释,设置监听地址,0.0.0.0 代表所有地址
55:network.host: 0.0.0.0
#59: 取消注释,ES服务的默认监听端口为 9200
59:http.port: 9200
#68: 取消注释,集群发现通过单播时间,指定要发现的节点node1,node2
68:discovery.zen.ping.unicast.hosts: ["node1","node2"]
2.2.2 创建数据存放路径并授权,启动elasticsearch
复制[root@node1 ~]# mkdir -p /data/elk_data
[root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data/
[root@node1 ~]# systemctl start elasticsearch.service
[root@node1 ~]# netstat -natp | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 43371/java
2.3 查看节点信息
复制#查看节点node1,node2的信息
[root@node1 ~]# firefox http://192.168.23.11:9200
[root@node2 ~]# firefox http://192.168.23.12:9200
#查看集群健康状态,status值为"green",则表示健康
[root@node1 ~]# firefox http://192.168.23.11:9200/_cluster/health?pretty
[root@node1 ~]# firefox http://192.168.23.12:9200/_cluster/health?pretty
#查看集群状态信息
[root@node1 ~]# firefox http://192.168.23.11:9200/_cluster/state?pretty
2.4 安装elasticsearch-hand
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。
安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。
node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
2.4.1 编译安装node
复制#上传软件包上传软件包 node-v8.2.1.tar.gz 到/opt
[root@node1 opt]# yum -y install gcc gcc-c++ make
[root@node1 ~]# cd /opt/
[root@node1 opt]# tar xf node-v8.2.1.tar.gz
[root@node1 node-v8.2.1]# ./configure && make -j 2 && make install
2.4.2 安装phantomjs
复制[root@node1 opt]# cd /opt/
[root@node1 opt]# tar xf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
[root@node1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/
[root@node1 bin]# cp phantomjs /usr/local/bin/
2.4.3 安装elasticsearch-hand 数据可视化工具
复制[root@node1 opt]# cd /opt/
[root@node1 opt]# tar -xf elasticsearch-head.tar.gz -C /usr/local/src/
[root@node1 opt]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
2.4.4 修改elasticsearch 主配置文件
复制#修改yml 文件,要注意yml的格式要求
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
.......
#在配置文件的最后添加(这是yml文件,冒号后面要有空格)
http.cors.enabled: true #开启跨域访问支持,默认是false
http.cors.allow-origin: "*" #指定跨域访问允许的域名地址为所有
[root@node1 ~]# systemctl restart elasticsearch.servic
2.4.5 启动elasticsearch-head 服务
必须在解压后的elasticsearch-head 目录下启动服务,进程会读取该目录下的gruntfile.js文件,否则可能启动失败。
复制[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
#elasticsearch-head 监听的端口是9100
[root@node1 elasticsearch-head]# netstat -natp | grep 910
2.4.6 访问测试
复制[root@node1 ~]# firefox http://192.168.23.11:9100
2.4.7 插入索引
#通过命令插入一个测试索引,索引为 index-demo,类型为 test。
复制curl -X PUT '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
}
#浏览器访问9100端口,查看索引信息
[root@node1 ~]# firefox http://192.168.23.11:9100
三elK Logstash 部署(Apache节点上操作)
Logstash 一般部署在需要监控其日志的服务器。在本案例中,Logstash 部署在 Apache 服务器上,用于收集 Apache 服务器的日志信息并发送到 Elasticsearch。
复制#修改主机名
[root@host13 ~]# hostnamectl set-hostname apache
#安装Apache服务
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
#安装java环境
[root@apache ~]# yum -y install java
[root@apache ~]# java -version
3.1 安装 logstash
复制#上传软件包logstash-5.5.1.rpm 到/opt 目录下
[root@apache opt]# cd /opt/
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
[root@apache opt]# systemctl start logstash.service
[root@apache opt]# systemctl enable logstash.service
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
3.2 测试logstash
Logstash 命令常用选项
-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
-e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
-t:测试配置文件是否正确,然后退出。
3.2.2 定义输入输出流
输入采用标准输入,输出采用标准输出(类似管道)
复制[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
。。。。。。
www.baidu.com #输入
2021-09-28T06:10:21.738Z apache www.baidu.com #输出
www.sina.com.cn #输入
2021-09-28T06:10:28.310Z apache www.sina.com.cn #输出
// 执行ctrl +c 退出
3.2.3 使用rubydebug 输出
使用 rubydebug 输出详细格式显示,codec 为一种编解码器
复制[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
www.baidu.com #输入
#输出
{
"@timestamp" => 2021-09-28T06:32:07.951Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
3.2.4 使用elasticsearch 进行输入(不是输出在屏幕上)
复制[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch{ hosts=>["192.168.23.11:9200"]} }'
www.baidu.com
www.sina.com.cn
3.3 定义logstash 的配置文件
Logstash 配置文件基本由三部分组成:input,output,以及 filter(可选,根据需要选择使用)
注意:input,filter,output 后面有空格
格式如下:
input {......}
filter {.....}
output {.....}
在每个部分中,也可以指定多个访问方式。例如,若要指定两个日志来源文件,则格式如下:
input {
file { path =>"/var/log/messages" type =>"syslog"}
file { path =>"/var/log/httpd/access.log" type =>"apache"}
}
复制#修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中。
#修改/var/log/messages权限,让 Logstash 可以读取日志
[root@apache opt]# chmod +r /var/log/messages
#注意,是yml文件,注意格式
[root@apache opt]# vim /etc/logstash/conf.d/system.conf
#输入
input {
file{
path =>"/var/log/messages" #指定要收集的日志位置
type =>"system" #自定义日志类型标识
start_position =>"beginning" #表示从快开始处收集
}
}
#输出
output {
#输出到elasticsearch
elasticsearch {
#指定elasticsearch服务器的地址和端口,多个ES服务器使用 “逗号空格” 隔开
hosts =>["192.168.23.11:9200", "192.168.23.12:9200"]
#指定输出到elasticsearch 的索引格式
index =>"system-%{+YYYY.MM.dd}"
}
}
3.4 访问测试
复制#重启logstash 服务
[root@apache opt]# systemctl restart logstash.service
#访问node 主机的 9100端口
[root@apache opt]# firefox http://192.168.23.11:9100/
四:elk之kiabana部署(在node1或者node2节点上操作)
4.1 安装kibana
上传软件包 kibana-5.5.1-x86_64.rpm 到 /opt 目录
复制[root@node1 opt]# cd /opt/
[root@node1 opt]# rpm -ivh kibana-5.5.1-x86_64.rpm
4.2 设置kibana的主配置文件
复制[root@node1 opt]# vim /etc/kibana/kibana.yml
#第2行:取消注释,kiabana 默认监听端口为5601
2// server.port: 5601
#第7行,取消注释,设置kiabana的监听地址。0.0.0.0表示所有地址
7// server.host: "0.0.0.0"
#21行,取消注释,设置和elasticsearch 建立连接的地址和端口
21// elasticsearch.url: "http://192.168.23.11:9200"
#第30 行,取消注释,设置在elasticsearch 中添加.kiabana索引
30// kibana.index: ".kibana"
4.3 启动kibana服务
复制[root@node1 opt]# systemctl start kibana.service
[root@node1 opt]# systemctl enable kibana.service
[root@node1 opt]# netstat -natp | grep 5601
4.4 验证kibana
浏览器访问http://192.168.23.11:5601
复制[root@node1 opt]# firefox http://192.168.23.11:5601
浏览器访问 http://192.168.23.11:5601 登录 Kibana,单击“Create Index Pattern”按钮添加索引, 在索引名中输入之前配置的 Output 前缀 apache_access-,并单击“Create”按钮。在用相同的方法添加 apache_error-索引。
选择“Discover”选项卡,在中间下拉列表中选择刚添加的 apache_access-* 、apache_error-* 索引, 可以查看相应的图表及日志信息。
如果无法显示图表信息,试试看关闭浏览器,在重新打开
4.5 将Apache服务器日志添加到elasticsearch
在 logstash节点, 将Apache服务器日志(访问的,错误的)添加到Elasticsearch 并通过kibana显示
复制[root@apache opt]# vim /etc/logstash/conf.d/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.23.11:9200", "192.168.23.12:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.23.11:9200", "192.168.23.12:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
4.6 访问测试
浏览器访问 http://192.168.23.11:9100 查看索引是否创建
复制[root@apache opt]# cd /etc/logstash/conf.d/
#测试配置文件
[root@apache conf.d]# logstash -tf apache_log.conf
#读取apache_log.conf配置文件(这个是前台启动,会将内容读取出来
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
[root@node1 ~]# firefox http://192.168.23.11:9100
浏览器访问 http://192.168.23.11:5601 登录 Kibana,单击“Create Index Pattern”按钮添加索引, 在索引名中输入之前配置的 Output 前缀 apache_access-,并单击“Create”按钮。在用相同的方法添加 apache_error-索引。
选择“Discover”选项卡,在中间下拉列表中选择刚添加的 apache_access-* 、apache_error-* 索引, 可以查看相应的图表及日志信息。
复制[root@node1 ~]# firefox http://192.168.23.11:5601
如果没有搜索到日志信息,可能是时间不对,选择的时间内没有访问日志。点击time picker 时间选择按钮,选择时间
五:Filebeat+ELK部署
节点 | 角色 |
---|---|
Node1节点(2C/4G):node1/192.168.23.11 | Elasticsearch , Kibana |
Node2节点(2c/4G) :node2/192.168.23.12 | Elasticsearch |
Apache 节点:apache/192.168.23.13 | Logstash, Apache |
Filebeat 节点: filebeat/192.168.23.104 | Filebeat |
阿帕奇基金会软件包。但是filebeat软件需要和elk软件版本对应
https://archive.apache.org/dist/
5.1 环境部署,安装filebeat
复制[root@host104 ~]# systemctl stop firewalld
[root@host104 ~]# setenforce 0
#将软件包 filebeat-6.2.4-linux-x86_64.tar.gz 上传到/opt 目录下
[root@host104 opt]# cd /opt/
[root@host104 opt]# tar xf filebeat-6.2.4-linux-x86_64.tar.gz
[root@host104 opt]# mv filebeat-6.2.4-linux-x86_64 /usr/local/filebeat
5.2 设置filebeat 的主配置文件,启动filebeat
复制[root@host104 opt]# cd /usr/local/filebeat/
[root@host104 filebeat]# vim filebeat.yml
#yml 文件注意格式,缩进和空格
#=========================== Filebeat prospectors ============
15// filebeat.prospectors:
21// - type: log #指定log类型,从日志文件中读取消息
24// enabled: true #开启收集
27// paths: #指定收集数据的路径
28// - /var/log/messages #从/var/log/messages中收集
29// - /var/log/*.log #从/var/log/目录中所以以 .log结尾的文件中shoji
31// fields: #指定字段,fields配置选项设置的一些参数字段可以添加到output中,值自定义
32// service_name: filebeat
33// log_type: log
34// service_id: 192.168.23.11
#默认是输出草ES中,可以将Elasticsearch output 部分的都注释
#-------Elasticsearch output----------
152// #output.elasticsearch:
154// # hosts: ["localhost:9200"]
#----------------------------- Logstash output ---
#指定输出到logstash中
157// output.logstash:
159// hosts: ["192.168.23.13:5044"] #指定logstash的ip和端口
[root@host104 filebeat]# ./filebeat -e -c filebeat.yml
#新开窗口,查看5044端口,这是filebeat的连接端口,连接logstash的5044端口。
#在logstash主机上,也可以查看到 开放了5044端口
[root@host104 ~]# netstat -natp | grep 5044
tcp 0 0 192.168.23.104:43538 192.168.23.13:5044 ESTABLISHED 46666/./filebeat
5.3在logstash 组件的节点上新建一个logstash配置文件
复制[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache conf.d]# vim logstash.conf
input {
beats {
port => "5044"
}
}
output {
elasticsearch {
hosts => ["192.168.23.11:9200"]
# %{[fields][server_name]} ,引入filebeat配置文件的filds字段配置的service_name字段的值作为索引
index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
#启动logstash
[root@apache conf.d]# logstash -f logstash.conf
5.4 访问测试
浏览器访问 http://192.168.23.11:5601 登录 Kibana,单击“Create Index Pattern”按钮添加索引“filebeat-*”,单击 “create” 按钮创建,单击 “Discover” 按钮可查看图表信息及日志信息。
复制[root@host104 ~]# firefox http://192.168.23.11:5601
端口
服务 | 端口 |
---|---|
elasticsearch | 9200 |
elasticsearch-head | 9100 |
logstash | 9600,9601 |
kibana | 5601 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现