部署ELK8.18对日志进行收集、展示
实验环境
192.168.10.40需要安装Elasticsearch和Kibana,都为java程序,占用内存会很大,将内存设为8G
一、ELK简介
ELK Stack 是 Elasticsearch、Logstash 和 Kibana 三个开源工具的组合,用于日志收集、存储和可视化分析。
Elasticsearch - 分布式搜索和分析引擎
Logstash - 服务器端数据处理管道
Kibana - 数据可视化仪表板工具
1、Elasticsearch
功能:
分布式、RESTful 搜索和分析引擎
基于 Apache Lucene 构建
提供近实时(NRT)的搜索能力
支持水平扩展和高可用性
特点:
文档导向:存储数据为 JSON 文档
强大的全文搜索能力
支持复杂的聚合操作
丰富的 API 和查询语言
2、Logstash
功能:
数据收集和处理管道
从多种来源采集数据
转换和丰富数据
将数据发送到各种"存储库"(如 Elasticsearch)
处理流程:
Input:从文件、数据库、消息队列等获取数据
Filter:解析、转换和丰富数据(如解析日志格式)
Output:将处理后的数据发送到目的地(通常是 Elasticsearch)
3、Kibana
功能:
数据可视化和探索工具
为 Elasticsearch 提供图形界面
创建丰富的仪表板和报表
提供强大的数据分析和可视化功能
主要特性:
丰富的图表类型(柱状图、线图、饼图等)
地图可视化
时间序列分析
机器学习集成
警报和通知功能
二、部署ELK
1、安装 Elasticsearch(192.168.10.40)
(1)上传elasticsearch-8.18.3-x86_64.rpm包到/root目录并安装
rpm -ivh elasticsearch-8.18.3-x86_64.rpm
超级用户密码
elastic用户:内置的超级管理员账号,拥有所有权限。
密码:首次安装时自动生成的密码rxrEobl3i-mg-WDComqa
立即记录此密码(首次登录 Kibana 或调用 ES API 时需要)。
(2)配置 Elasticsearch JVM
/etc/elasticsearch/jvm.options 是 Elasticsearch 的 JVM(Java 虚拟机)参数配置文件,主要用于设置 Elasticsearch 运行时的内存分配和垃圾回收等参数。
vim /etc/elasticsearch/jvm.options
修改:
建议将这两个值设置为相同,以避免运行时内存调整带来的性能开销
推荐设置为不超过物理内存的50%,且不超过32GB(由于JVM内存指针压缩技术限制)
(3)配置Elasticsearch
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bakvim /etc/elasticsearch/elasticsearch.yml
修改:
(4)启动Elasticsearch服务
systemctl enable --now elasticsearchss -naplt | grep java
(5)使用浏览器访问 Elasticsearch
给浏览器添加elasticsearch-head插件
插件下载地址:https://crxdl.com/
2、安装 Kibana(192.168.10.40)
(1)上传kibana-8.18.3-x86_64.rpm包到/root目录并安装
rpm -ivh kibana-8.18.3-x86_64.rpm
(3)配置 Kibana
cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bakvim /etc/kibana/kibana.yml
修改:
(4)启动 Kibana服务
systemctl enable --now kibanass -anplt | grep 5601
(5)使用浏览器访问Kibana
192.168.10.40:5601
3、Elasticsearch插件(192.168.10.40)
(1)使用Kibana 开发工具查看集群中索引的概要信息
(2)安装analysis-icu插件
安装Elasticsearch 官方提供的文本分析插件analysis-icu
/usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
查看 Elasticsearch 中已安装的插件
/usr/share/elasticsearch/bin/elasticsearch-plugin list
重启elasticsearch服务加载插件
systemctl restart elasticsearch
(3)使用analysis-icu分词
(4)安装ik插件给中文分词
插件地址:https://release.infinilabs.com/analysis-ik/stable/
wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.18.3.zipunzip elasticsearch-analysis-ik-8.18.3.zip -d elasticsearch-analysis-ikcp -r elasticsearch-analysis-ik /usr/share/elasticsearch/plugins/
查看 Elasticsearch 中已安装的插件
/usr/share/elasticsearch/bin/elasticsearch-plugin list
重启elasticsearch服务加载插件
systemctl restart elasticsearch
(5)使用ik分词
核心区别
特性 | ik_smart | ik_max_word | standard |
设计目标 | 精确匹配、短语查询 | 高召回率、模糊搜索 | 通用西文分词 |
中文支持 | ✔️ 优化中文处理 | ✔️ 优化中文处理 | ❌ 逐字拆分,无中文优化 |
适用场景
分词器 | 推荐场景 | 不适用场景 |
ik_smart | 精确搜索(如商品名称、ID) 短语查询 | 需要模糊匹配或同义词扩展的场景 |
ik_max_word | 内容搜索(如文章、评论) 需要高召回率的场景 | 对精度要求高且数据量大的场景 |
standard | 英文/拉丁语系文本 不需要语言分析的场景(如日志、代码) | 中文文本处理(会逐字拆分) |
4、安装 Logstash(192.168.10.41)
(1)上传logstash-8.18.3-x86_64.rpm包到/root目录并安装
rpm -ivh logstash-8.18.3-x86_64.rpm
(2)创建配置文件
参考elastic官方文档:https://www.elastic.co/docs/reference/logstash/plugins
将 /var/log/messages 的系统日志发送到 Elasticsearch
cd /etc/logstash/conf.d/vim messagetest.conf
添加:
input {file {path => ["/var/log/messages"] # 监控的文件路径start_position => "beginning" # 从文件开头读取(首次运行时)}}output {elasticsearch {hosts => ["http://192.168.10.40:9200"] # ES地址index => "message_%{+yyyy.MM.dd}" # 按日创建的索引名}}
(3)启动Logstash
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/messagetest.conf
(4)查找索引
(5)创建数据视图
5、使用Logstash收集nginx的日志发送到 Elasticsearch(192.168.10.41)
(1)安装nginx服务并启动
dnf -y install nginxsystemctl enable --now nginx
(2)模拟访问网站生成日志
curl http://192.168.10.41
(2)创建收集nginx访问日志的配置文件
cd /etc/logstash/conf.d/vim nginx_access_log.conf
添加:
input {file {path => ["/var/log/nginx/access.log"]start_position => "beginning"}}output {elasticsearch {hosts => ["http://192.168.10.40:9200"]index => "nginx_access_%{+yyyy.MM.dd}"}}
(3)启动Logstash
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_access_log.conf
(4)查找索引
(5)创建数据视图
这种日志格式是将原始日志直接传输过来,所以信息都挤在单个字符串中,缺乏结构化数据,基本无用。
6、使用Logstash收集nginx的JSON格式日志发送到 Elasticsearch(192.168.10.41)
(1)将nginx的日志修改为JSON格式
变量参考nginx官方文档:https://nginx.org/en/docs/varindex.html
vim /etc/nginx/nginx.conf
添加粗体部分修改:
http {
……
log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"server_name":"$server_name",'
'"upstream_addr":"$upstream_addr",'
'"upstream_response_time":"$upstream_response_time",'
'"upstream_status":"$upstream_status",'
'"scheme":"$scheme",'
'"request_method":"$request_method",'
'"request_uri":"$request_uri",'
'"server_protocol":"$server_protocol",'
'"bytes_sent":"$bytes_sent",'
'"connection":"$connection",'
'"connection_requests":"$connection_requests",'
'"msec":"$msec",'
'"pipe":"$pipe",'
'}';
(2)重启nginx服务
systemctl restart nginx
(3)模拟访问网站生成JSON格式日志
curl http://192.168.10.41
(4)启动Logstash
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_access_log.conf
(5)查看数据视图
现在看到的日志为JSON格式,键对应值。有些日志也不适合JSON格式。
7、使用Logstash收集nginx的日志,通过filter对日志进行处理,并使用filter的插件grok对字段提取,发送到 Elasticsearch(192.168.10.41)
(1)修改nginx日志格式
vim /etc/nginx/nginx.conf
修改:
(2)重启nginx服务
systemctl restart nginx
(3)模拟访问网站生成日志
curl http://192.168.10.41
(4)创建收集nginx访问日志的配置文件
查看Grok每个参数所匹配的内容参考Grok官方:https://github.com/logstash-plugins/logstash-patterns-core/blob/main/patterns/ecs-v1/grok-patterns
cd /etc/logstash/conf.d/vim nginx_filter_access_log.conf
添加:
input {file {path => ["/var/log/nginx/access.log"]start_position => "beginning"}}filter {grok {match => {"message" => ['%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:timestamp}\] "%{WORD:http_method} %{URIPATH:url_path}(?:%{URIPARAM:url_query})? HTTP/%{NUMBER:http_version}" %{NUMBER:status:int} %{NUMBER:bytes_sent:int} "%{DATA:referrer}" "%{DATA:user_agent}" "%{DATA:x_forwarded_for}"']}}}output {elasticsearch {hosts => ["http://192.168.10.40:9200"]index => "nginx_filter_access_log_%{+yyyy.MM.dd}"}}
声名:
%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:timestamp}\] "%{WORD:http_method} %{URIPATH:url_path}(?:%{URIPARAM:url_query})? HTTP/%{NUMBER:http_version}" %{NUMBER:status:int} %{NUMBER:bytes_sent:int} "%{DATA:referrer}" "%{DATA:user_agent}" "%{DATA:x_forwarded_for}也可以用一个"%{COMBINEDAPACHELOG}"来表示,但是每个键的名称是定义好的,生产中也不会使用。
使用kibana对语法进行检测
cat /var/log/nginx/access.log
192.168.10.41 - - [10/Jul/2025:10:48:19 +0800] "GET / HTTP/1.1" 200 7620 "-" "curl/7.76.1" "-"
(5)启动Logstash
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_filter_access_log.conf
也可以使用systemctl start logstash启动,会读/etc/logstash/conf.d下的配置文件,全部启动
(6)查找索引
(7)创建数据视图
可以看到每个键对应的值
(8)创建Dashboards(仪表板)
(8.1)创建网站PV(页面浏览量)的可视化看板
因为是页面浏览量,选择那个都可以
测试(192.168.10.41)
安装压测工具模拟访问量
dnf -y install httpd-tools
ab -c 10 -n 100 http://192.168.10.41/
(8.2)创建网站UV(独立访客量)的可视化看板
测试
使用192.168.10.40和宿主机访问192.168.10.41的网页
curl http://192.168.10.41
(8.3)创建网站总流量消耗的可视化看板
修改字段bytes_sent的单位格式
(8.4)返回主页访问已存在的Dashboards
(8.5)创建访问网站状态码的可视化看板
测试(192.168.10.41)
使用压测工具模拟生成错误访问日志
ab -c 10 -n 100 http://192.168.10.41/aa
(8.6)创建每个IP访问网站页面数量的可视化看板
测试
使用192.168.10.1(宿主机)访问192.168.10.41的网页并刷几次
(8.7)创建每个URL访问数量的可视化看板
测试(192.168.10.41)
使用压测工具模拟生成/目录访问量
ab -c 10 -n 100 http://192.168.10.41/
8、查看kibana样例数据