文章目录
- 前言
- 理论部分
-
- 1_ELK日志分析系统概述
- 2_Elasticsearch介绍
- 3_Logstash介绍
- 4_Kibana介绍
- 5_为何使用ELK进行数据可视化?
- 6_完整日志系统基本特征
- [7_ELK 的工作原理⭐](#7_ELK 的工作原理⭐)
- 实验部分
-
- 1_ELK系统部署
-
- 1.1_环境准备
- 1.2_Elasticsearch集群部署
- 1.3_安装Elasticsearch-head
- [1.4_Logstash 部署](#1.4_Logstash 部署)
-
- [① 安装Logstash](#① 安装Logstash)
- [② 测试Logstash](#② 测试Logstash)
- [③ 配置系统日志采集](#③ 配置系统日志采集)
- [1.5_Kibana 部署](#1.5_Kibana 部署)
-
- [① 安装与配置](#① 安装与配置)
- [② 启动服务](#② 启动服务)
- [③ 验证与创建索引模式](#③ 验证与创建索引模式)
- ④添加Apache日志
- ④添加mysql日志
- ⑤添加tomcat日志
- 2_Filebeat+ELK部署
- 结语
前言
本文档系统梳理了 ELK 企业级日志分析系统 的核心组成、工作原理、部署流程及扩展架构(如 Filebeat + ELK)。内容涵盖 Elasticsearch、Logstash、Kibana 三大组件的功能特性、使用场景与配置细节,并提供完整的实验部署步骤,适用于日志集中化管理、实时监控、安全分析等企业级应用场景。
- ELK 概述与核心组件功能
- Elasticsearch 架构、特点与集群部署
- Logstash 数据采集、过滤与输出机制
- Kibana 可视化与交互式分析能力
- 完整 ELK 系统部署实验(含 Apache 日志接入)
- Filebeat 轻量级日志采集器集成(EFLK 架构)
理论部分
1_ELK日志分析系统概述
ELK 是一套开源的日志集中处理解决方案,由 Elasticsearch、Logstash、Kibana 三大组件构成,用于实现日志的 收集、存储、搜索、分析与可视化。适用于分布式系统中多源日志的统一管理。
1.1_核心组件角色
| 组件 | 功能 | 技术特点 |
|---|---|---|
| Elasticsearch | 分布式搜索引擎,负责日志存储与全文检索 | 基于 Lucene,RESTful API,支持高可用集群 |
| Logstash | 数据采集与处理管道 | 支持 input → filter → output 流程,插件丰富 |
| Kibana | 数据可视化前端 | 提供图表、仪表盘、告警、机器学习等高级功能 |
适用场景 :当企业拥有数十至上百台服务器,需集中分析系统/应用/安全日志时,传统
grep工具效率低下,ELK 可提供高效、可扩展的日志分析平台。
2_Elasticsearch介绍
Elasticsearch 是一个基于 Lucene 的分布式、实时、可扩展的搜索引擎,使用 Java 开发,通过 RESTful API 提供全文搜索与结构化查询能力。
https://blog.csdn.net/qq_17153885/article/details/135323449
2.1_核心功能
- 全文搜索:快速索引与检索文本数据
- 实时分析:数据写入后立即可查
- 分布式架构:支持横向扩展与高可用
- RESTful API:HTTP 接口便于集成
2.2_架构与关键概念
Cluster(集群)
└── Node(节点):主节点 / 数据节点
└── Index(索引) ≈ 数据库表
├── Shard(分片):数据分片,提升并发与容量
└── Replica(副本):冗余备份,提高容错性
└── Document(文档):JSON 格式最小数据单元
① 集群健康状态
| 状态 | 含义 |
|---|---|
| green | 所有主分片与副本均正常 |
| yellow | 主分片正常,副本缺失(单节点常见) |
| red | 主分片丢失,数据不完整 |
2.3_使用场景
- 日志与事件流分析(配合 Logstash/Kibana)
- 电商商品搜索、社交内容检索
- 系统监控与告警
- 商业智能(BI)与趋势分析
2.4_优缺点
优点 :高性能、易扩展、灵活查询、开源社区活跃
缺点:内存消耗大、DSL 学习曲线陡峭、大规模集群运维复杂
3_Logstash介绍
Logstash是用Ruby编写、运行于JVM 的数据处理管道,支持从多源采集、过滤转换、实时输出到目标系统(如 ES)。充当"日志搬运工"的角色。
3.1_三大处理阶段
Logstash 配置文件由三个核心部分组成,定义了数据的 输入 → 处理 → 输出 流程:
| 部分 | 作用 | 常见用法 |
|---|---|---|
| input | 从数据源采集原始日志 | file(日志文件) beats(Filebeat) kafka、syslog 等 |
| filter(可选) | 对数据清洗与增强 | 使用 grok(正则解析) date(时间格式化) mutate(字段修改)等插件 |
| output | 将处理后的数据发送到目标系统 | elasticsearch(主输出) file、kafka、stdout(调试)等 |
数据清洗:数据处理,包括过滤和格式化、去重等
配置模板 :[③ 配置系统日志采集](#③ 配置系统日志采集)
conf
input { ... }
filter { ... } # 按需启用
output { ... }
示例场景 :
从Apache日志文件(input)提取客户端IP和状态码(filter),再写入Elasticsearch(output)。
3.2_使用场景
- 集中收集系统/应用日志
- 日志格式标准化(如解析 Nginx/Apache 日志)
- 多目的地分发(ES + S3 + HDFS)
3.3_轻量级替代方案
① Filebeat
- 轻量级日志 shipper,资源占用低
- 常用于 EFLK 架构(Filebeat → Logstash → ES → Kibana)
- 优势:支持 ACK 机制、背压感知、本地缓冲
ACK机制:发送日志后需接收方确认,确保不丢失。
背压感知:下游处理慢时自动减速,防止崩溃。
本地缓冲:日志位置和未发数据暂存本地,保障可靠传输。
② Fluentd
- 更轻量、高效,常用于 EFK 架构
- 在 Kubernetes 中通过 DaemonSet 部署,采集容器日志。
!question\] 为何引入消息队列? 在高并发场景下,使用 **Redis/Kafka/RabbitMQ** 作为缓冲层,可削峰填谷、解耦 Logstash 与数据源,防止日志丢失。
4_Kibana介绍
Kibana 是 Elasticsearch 的官方可视化工具,提供 Web 界面用于 探索、分析、展示 存储在 ES 中的数据。
4.1_核心功能
- Visualizations:数据可视化,折线图、饼图、地图等。
- Dashboards:仪表板,多图表聚合展示
- Log Management:日志管理
- Discover:原始日志搜索(支持 KQL / Lucene 语法)
- TSVB:时间序列分析(Time Series Analytics)
- Alerting:阈值告警
- Monitoring:监控
- Security:RBAC 权限控制,安全和访问控制(Security & Access Control)
- Machine Learning:机器学习,异常检测。(新技术:Ai智能运维、Aiops)
- Canvas & Reporting:自定义报告导出(PDF/CSV)
- Maps & Geospatial Visualization:地图和地理可视化
4.2_使用场景
- 运维日志排查
- 实时业务监控(如用户行为、交易流水)
- 安全威胁检测(结合 Elastic Security)
- 自动化异常预警
4.3_工作原理
发送 存储 查询 渲染 Logstash/Filebeat Elasticsearch Indices Kibana Dashboard/Charts
Kibana 不存储数据,仅作为 ES 的前端查询与展示层。
5_为何使用ELK进行数据可视化?
- 日志分散难查 :传统
grep在多服务器环境下效率极低。 - 集中分析需求:ELK将日志统一收集、索引,支持快速全文检索与聚合统计。
- 直观洞察问题:Kibana 提供图表、仪表盘,将原始日志转化为趋势、异常、流量等可视化信息。
- 实时监控告警:可基于可视化数据设置阈值告警,及时响应故障或安全事件。
- 降低使用门槛:非技术人员也能通过图形界面探索数据,无需写复杂命令。
简言之:从"看日志"升级为"看懂日志"。
以下是针对 第6、7部分 的简明整理,格式与全文风格一致:
6_完整日志系统基本特征
一个企业级的完整日志系统应具备以下五大核心能力:
| 特征 | 说明 |
|---|---|
| 收集(Collect) | 支持从多源(服务器、应用、网络设备等)采集日志 |
| 传输(Transport) | 稳定、可靠地将日志解析、过滤并传至存储系统(支持缓冲/队列防丢失) |
| 存储(Store) | 高效存储海量日志,支持快速检索与长期归档 |
| 分析(Analyze) | 提供 UI 或查询语言,支持搜索、聚合、统计与关联分析 |
| 告警(Alert) | 可配置规则,对异常或关键事件自动触发通知(邮件、Webhook 等) |
ELK 正是围绕这五个特征构建的一站式解决方案。
7_ELK 的工作原理⭐
ELK 的数据流转遵循 采集 → 处理 → 存储 → 展示 的四步流程:
数据分析与展示层 数据存储层 微服务日志 日志收集层 access.log
error.log tomcat.log tomcat.log 可视化图表
仪表盘 Kibanan Client ES01
存储数据 ES02
存储数据 淘宝日志 Logstash
数据过滤
格式化 Nginx Tomcat Mysql
核心步骤说明:
- 采集 :在各服务器部署 Logstash 或更轻量的 Filebeat,实时读取日志文件。
- 处理:Logstash 对原始日志进行解析(如提取 IP、状态码)、格式化、添加字段等。
- 存储 :处理后的结构化数据发送到 Elasticsearch 集群,按索引(index)存储并建立全文索引。
- 展示 :Kibana 连接 Elasticsearch,用户通过 Web 界面创建可视化图表、仪表盘,实现交互式分析。
关键优势:端到端自动化、近实时(秒级延迟)、支持 PB 级日志规模、开放可扩展。
实验部分
运行环境
- OS:Centos 7.9
- JDK:java-1.8.0-openjdk
- ELK:7.8.1(tar包)
ELK官方网站(中文) :
https://www.elastic.co/cn/downloads/
1_ELK系统部署
| 节点 | IP 地址 | 角色 | 配置 |
|---|---|---|---|
| node1 | 192.168.100.1 | Elasticsearch + Kibana | 2核/4G |
| node2 | 192.168.100.2 | Elasticsearch | 2核/4G |
| node3 | 192.168.100.3 | Logstash + mysql和tomcat | - |
1.1_环境准备
所有节点
shell
systemctl stop firewalld
setenforce 0
yum -y install perl-Digest-SHA-5.85-4.el7.x86_64
关闭防火墙与 SELinux,避免网络和权限问题。
shell
# 设置主机名(示例:node2)
hostnamectl set-hostname apache
shell
# 配置hosts解析
echo "192.168.100.1 node1" >> /etc/hosts
echo "192.168.100.2 node2" >> /etc/hosts
shell
yum -y install java-1.8.0-openjdk
java -version
确保 Java 环境(OpenJDK 1.8+)
1.2_Elasticsearch集群部署
node1 & node2
- 首先创建并切换到运行Elacticsearch的用户
shell
useradd -mU elasticsearch
su - elasticsearch
① 安装Elasticsearch
- 下载tar包
shell
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz
- 校验下载文件完整性
shell
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-7.8.1-linux-x86_64.tar.gz.sha512
- 解压安装包,进入项目目录。
shell
tar -xzvf elasticsearch-7.8.1-linux-x86_64.tar.gz
cd elasticsearch-7.8.1
- rpm包安装(备选)
shell
rpm -ivh elasticsearch-7.8.1.rpm
systemctl daemon-reload
systemctl enable elasticsearch.service
② 配置 elasticsearch.yml
- 修改elasticsearch主配置文件
shell
cp config/elasticsearch.yml config/elasticsearch.yml_bak
vim config/elasticsearch.yml
yaml
# 以下内容行取消注释
cluster.name: my-elk-cluster # 17行,集群名字。
node.name: node1 # 23行,节点名字,node2上改为node2。
node.master: true # 添加 设置该节点为主节点候选人
node.data: true # 添加 设置该节点可以存储数据
path.data: /data/elk_data # 35行,数据库存放路径
path.logs: /var/log/elasticsearch/ # 39行,日志存放路径。
bootstrap.memory_lock: false # 45行,启动时不锁定内存。
network.host: 0.0.0.0 # 57行,监听地址为所有地址。
http.port: 9200 # 61行,默认监听端口为9200。
# discovery.zen.ping.unicast.hosts: ["node1", "node2"] # 68行,6.8.1 集群通过单播实现,指定要发现的节点 node1、node2。
discovery.seed_hosts: ["192.168.100.1:9300", "192.168.100.2:9300"] # 70行,7.8.1,发现节点。
cluster.initial_master_nodes: ["node1", "node2"] #74行,7.8.1,候选主节点。
shell
grep -v "^#" config/elasticsearch.yml
③ 创建数据目录并授权
- 数据源目录
shell
exit # 退回root用户
mkdir -p /data/elk_data
chown -R elasticsearch:elasticsearch /data/elk_data/
- 日志目录
shell
mkdir /var/log/elasticsearch
chown -R elasticsearch:elasticsearch /var/log/elasticsearch
④ 启动并验证 [1](#1)
shell
su - elasticsearch
cd elasticsearch-7.8.1/
# 交互运行测试看有没有报错
bin/elasticsearch
# 测试没什么问题可以放后台运行
nohup bin/elasticsearch -d -p pid.txt &
ss -antulp | grep 9200
访问
http://192.168.100.1:9200/_cluster/health?pretty应返回"status":"green"
1.3_安装Elasticsearch-head
Elasticsearch-head用于查看ES的效果,企业里一般不装,都用API查看:
shell
# 黑屏操作下 查看ES索引情况(更多的可以另外找)
# 查看节点信息
curl -X GET "http://localhost:9200/_cat/nodes?v"
# 列出当前索引
curl -X GET "http://localhost:9200/_cat/indices?h=index"
# 删除一条索引
curl -X DELETE "http://localhost:9200/索引名称"
# {"acknowledged":true} 表示成功
# 查看看索引是否存在
curl -X HEAD "http://localhost:9200/索引名称"
# (查看指定索引内容 比如教案中插入了index_mode1,那么你就将该命令中的my_index换成index_mode1)
curl -X GET "http://localhost:9200/my_index?pretty"
# 基础格式(默认 ES 运行在本地 9200 端口)
curl -X GET "http://localhost:9200/_cat/indices?v"
可选,node1或2
① 安装Node.js
node.js安装包:
shell
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1
./configure && make && make install
② 安装PhantomJS
shell
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
cp /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
③ 安装head插件
shell
tar -zxvf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head/
npm install
④ 修改ES配置支持跨域
yaml
# /etc/elasticsearc/elasticsearch.yml 末尾追加
http.cors.enabled: true
http.cors.allow-origin: "*"
shell
systemctl restart elasticsearch
⑤ 启动head服务
shell
cd /usr/local/src/elasticsearch-head/
npm run start &
⑥ 通过 Elasticsearch-head查看Elasticsearch信息
监听端口9100 ,访问
http://192.168.100.1:9100可图形化管理集群。
- 连接ES集群
连接按钮前输入http://192.168.100.1:9200/→点击连接
| RESTful API的基本格式 | |
|---|---|
GET /index/doc_type/id |
用于创建新的文档 |
POST /index/doc_type/ |
用于获取指定ID的文档 |
PUT /index/doc_type/id |
用于更新指定ID的文档 |
DELETE /index/doc_type/id |
用于删除指定ID的文档 |
GET /index/doc_type/_search?q=field:value |
用于搜索包含特定字段和值的文档 |
⑦ 插入索引
- 往Elasticsearch插入一条测试数据
新版本(7.x ~ 8.x)
shell
curl -X PUT 'localhost:9200/index-demo1/_doc/1?pretty' \
-H 'Content-Type: application/json' \
-d '{"user":"zhangsan","mesg":"hello world"}'
| 部分 | 含义 |
|---|---|
curl |
命令行发 HTTP 请求 |
-X PUT |
创建或更新一条数据 |
localhost:9200 |
Elasticsearch 地址 |
index-demo1 |
索引名(相当于数据库表) |
_doc |
类型(新版本不再支持自定义type) |
1 |
文档 ID(这条数据的唯一编号) |
?pretty |
让返回结果好看点(格式化输出) |
-H 'Content-Type...' |
声明发送的是 JSON 数据 |
-d '{...}' |
要存的数据内容 |
| RESTful API 格式 | 用途 |
|---|---|
PUT /index/_doc/id |
用于创建或全量替换 指定 ID 的文档(推荐用_doc) |
POST /index/_doc/ |
用于创建新文档,系统自动生成ID |
GET /index/_doc/id |
用于获取指定ID的文档内容 |
DELETE /index/_doc/id |
用于删除指定ID的文档 |
GET /index/_doc/_search?q=field:value |
用于搜索包含特定字段和值的文档 |
- 插完后可以在elasticsearch-head里查看,确认连接和数据是否正常。
1.4_Logstash 部署
node3(apache)
Logstash一般部署在需要监控其日志的服务器。本案例部署在Apache服务器,用于收集Apache日志信息并发送到Elasticsearch。
- 首先创建并切换到运行logstash的用户
shell
useradd -mU logstash
su - logstash
① 安装Logstash
- 下载tar包
shell
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.1.tar.gz
- 校验下载文件完整性
shell
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.1.tar.gz.sha512
shasum -a 512 -c logstash-7.8.1.tar.gz.sha512
- 解压安装包,进入项目目录。
shell
tar -xzvf logstash-7.8.1.tar.gz
cd logstash-7.8.1
- 设置文件寻找路径
shell
cp config/pipelines.yml config/pipelines.yml_bak
vim config/pipelines.yml
yml
- pipeline.id: main #9行,启用一个叫main的管道。
path.config: "config/conf.d/*.conf" #15行,从 config/conf.d/ 目录下加载所有 .conf 文件。
- 设置所有IP都可以监听
shell
cp config/logstash.yml config/logstash.yml_bak
vim config/logstash.yml
yml
http.host: 0.0.0.0 # 118行
- rpm包安装(备选)
shell
rpm -ivh logstash-7.8.1.rpm
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
systemctl enable logstash
② 测试Logstash
- 输入采用标准输入,输出采用标准输出(类似管道)
shell
bin/logstash -e 'input { stdin{} } output { stdout{} }'
- 使用rubydebug输出详细格式显示,codec为一种编解码器。
shell
bin/logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
输入任意文本或域名,应输出带时间戳、host、message 的 JSON。
- 使用Logstash将信息写入Elasticsearch中。
shell
bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.1:9200"] } }'
结果不在标准输出显示,而是发送至Elasticsearch中,可浏览器访问
http://192.168.100.1:9100/查看索引信息和数据浏览(需要安装head)。
③ 配置系统日志采集
- 编辑配置文件
shell
mkdir config/conf.d
vim config/conf.d/system.conf
conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
path:指定要收集的日志的位置
type:自定义日志类型标识
start_position":从什么位置收集
"beginning":开始位置
elasticsearch {:输出到ES
hosts => ...:指定ES服务器的地址和端口
index => ...:指定输出到ES的索引格式
- 给采集的信息源赋权
shell
chmod +r /var/log/messages
④ 启动并验证 [1](#1)
shell
su - logstash
cd logstash-7.8.1/
# 交互运行测试看有没有报错
bin/logstash -f config/conf.d/
# 测试没什么问题可以放后台运行
nohup bin/logstash -f config/conf.d/ &
# 查看启动日志
tail -f logs/logstash-plain.log
ss -antulp | grep 9600
1.5_Kibana 部署
官方网站 :
https://www.elastic.co/cn/downloads/kibana/
node1
- 首先创建并切换到运行logstash的用户
shell
useradd -mU kibana
su - kibana
① 安装与配置
- 下载tar包
shell
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.1-linux-x86_64.tar.gz
- 校验下载文件完整性
shell
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c kibana-7.8.1-linux-x86_64.tar.gz.sha512
- 解压安装包,进入项目目录。
shell
tar -xzvf kibana-7.8.1-linux-x86_64.tar.gz
cd kibana-7.8.1-linux-x86_64
- rpm包安装(备选)
shell
rpm -ivh kibana-7.8.1-x86_64.rpm
- 设置Kibana主配置文件
shell
cp config/kibana.yml config/kibana.yml_bak
vim config/kibana.yml
yaml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.100.1:9200"]
kibana.index: ".kibana"
server.port::2行,监听端口。
server.host::7行,监听地址。
elasticsearch.hosts::28行,和ES建立连接的地址和端口
kibana.index::37行,在ES中添加.kibana索引
② 启动服务
shell
su - kibana
cd kibana-7.8.1-linux-x86_64/
# 测试运行
bin/kibana
# 测试没问题放后台执行
nohup bin/kibana &
ss -antulp | grep 5601
③ 验证与创建索引模式
- 浏览器访问
http://192.168.100.1:5601 - (Stack) Management → Index Pattern → Create index pattern
- Index pattern:
system-*→Next step - Time Filter field name:
@timestamp→Create index pattern - 进入Discover查看日志
④添加Apache日志
node3(logstash)
- 将Apache的访问日志、错误日志,添加到Elasticsearch,并通过Kibana显示。
shell
vim config/conf.d/apache_log.conf
conf
input {
file {
path => "/var/log/httpd/access_log"
type => "access"
start_position => "beginning"
}
file {
path => "/var/log/httpd/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
- 启动并加载logstash配置文件
shell
su - logstash
cd logstash-7.8.1/
killall java
nohup bin/logstash -f config/conf.d/ &
ss -antulp | grep 9600
在Kibana中分别创建
apache_access-*和apache_error-*索引模式。
- 浏览器访问
http://192.168.100.1:5601 - (Stack) Management→Index Pattern
- Create index pattern→Index pattern:
apache_access-*、apache_error-*→Next step
- Time Filter field name:
@timestamp→Create index pattern - Discover→Add a filter:
apache_error-*、apache_access-*→可以查看相应的图表及日志信息
④添加mysql日志
node3(logstash)
- 安装完mysql后在
/etc/my.cnf配置文件增加以下内容
cnf
[mysqld]
# 启用日志,影响性能,生产环境不推荐,建议使用慢查询日志。
general_log = 1
general_log_file = /var/log/mysql.log
# 慢查询日志,只记录运行超时的SQL语句
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 0
# 错误日志
log_error = /var/log/mysql/error.log
- 给mysql写入日志的权限
shell
mkdir -p /var/log/mysql
chown mysql:mysql /var/log/mysql
- 重启mysql服务单元
shell
systemctl restart mysqld.service
- 将mysql的操作日志、慢查询日志、错误日志,添加到Elasticsearch,并通过Kibana显示。
shell
vim config/conf.d/mysql_log.conf
conf
input {
file {
path => "/var/log/mysql.log"
type => "mysql"
start_position => "beginning"
}
file {
path => "/var/log/mysql/mysql-slow.log"
type => "slow"
start_position => "beginning"
}
file {
path => "/var/log/mysql/error.log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "mysql" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "mysql-%{+YYYY.MM.dd}"
}
}
if [type] == "slow" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "mysql-slow-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "mysql-error-%{+YYYY.MM.dd}"
}
}
}
- 给日志增加其他人的读权限
shell
chmod -R +r /var/log/mysql
-
增加
/var/log/mysql.log日志,mysql使用增删改查即可。 -
增加
/var/log/mysql/error.log日志,输错一次密码即可。 -
增加
/var/log/mysql/mysql-slow.log日志:
shell
mysql -uroot -p -e "SELECT SLEEP(2);"
shell
su - kibana
cd kibana-7.8.1-linux-x86_64/
killall java
nohup bin/kibana &
ss -antulp | grep 5601
- 在Kibana添加索引,方法已经介绍过。
⑤添加tomcat日志
| 文件名 | 用途 | 是否按天切 | 是否建议采集 |
|---|---|---|---|
catalina.out |
所有输出汇总(启动、异常、GC) | ❌ 否 | ✅ 是(配合日志轮转) |
catalina.*.log |
Tomcat 内部运行日志 | ✅ 是 | ✅ 是 |
localhost.*.log |
Web 应用输出(如 System.out) | ✅ 是 | ✅ 是 |
manager.*.log |
/manager 操作日志 | ✅ 是 | 🔍 按需 |
host-manager.*.log |
虚拟主机管理日志 | ✅ 是 | 🔍 按需 |
localhost_access_log.*.txt |
访问日志(类似 Nginx access) | ✅ 是 | ✅ 必采 |
| 📌 一句话记清: | |||
看错误 → catalina.out;做分析 → 采集所有带日期的 .log 和 access_log。 |
node3(logstash)
- 安装和启动tomcat后给logs日志添加读权限。
shell
chmod +x /usr/local/tomcat/
chmod +x /usr/local/tomcat/logs
chmod -R +r /usr/local/tomcat/logs/
- 将tomcat的
catalina.out、catalina.*.log、localhost.*.log、localhost_access_log.*.txt,添加到Elasticsearch,并通过Kibana显示。
shell
su - logstash
cd logstash-7.8.1/
vim config/conf.d/tomcat_log.conf
conf
input {
file {
path => "/usr/local/tomcat/logs/catalina.out"
type => "catalina-out"
start_position => "beginning"
}
file {
path => "/usr/local/tomcat/logs/catalina.*.log"
type => "catalina-log"
start_position => "beginning"
}
file {
path => "/usr/local/tomcat/logs/localhost.*.log"
type => "localhost-log"
start_position => "beginning"
}
file {
path => "/usr/local/tomcat/logs/localhost_access_log.*.txt"
type => "access-log"
start_position => "beginning"
}
}
output {
if [type] == "catalina-out" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "tomcat-catalina-out-%{+YYYY.MM.dd}"
}
}
if [type] == "catalina-log" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "tomcat-catalina-log-%{+YYYY.MM.dd}"
}
}
if [type] == "localhost-log" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "tomcat-localhost-log-%{+YYYY.MM.dd}"
}
}
if [type] == "access-log" {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "tomcat-access-log-%{+YYYY.MM.dd}"
}
}
}
- 启动并加载logstash配置文件
shell
su - logstash
cd logstash-7.8.1/
killall java
nohup bin/logstash -f config/conf.d/ &
ss -antulp | grep 9600
- 在Kibana添加索引,方法已经介绍过。
2_Filebeat+ELK部署
| 节点 | IP 地址 | 角色 | 配置 |
|---|---|---|---|
| node1 | 192.168.100.1 | Elasticsearch + Kibana | 2核/4G |
| node2 | 192.168.100.2 | Elasticsearch | 2核/4G |
| node3 | 192.168.100.3 | Logstash | - |
| node4 | 192.168.100.4 | Filebeat + mysql和tomcat | - |
官方网站(中文下载):
https://www.elastic.co/cn/downloads/beats/filebeat
- 还原所有节点,重新安装Elasticsearch、Kibana、Logstash
node4(filebeat)
① 安装Filebeat
- 首先创建并切换到运行filebeat的用户
shell
useradd -mU filebeat
su - filebeat
- 下载tar.gz包
shell
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-linux-x86_64.tar.gz
- 校验下载文件完整性
shell
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c filebeat-7.8.1-linux-x86_64.tar.gz.sha512
- 解压并进入项目目录
shell
tar -zxvf filebeat-7.8.1-linux-x86_64.tar.gz
cd filebeat-7.8.1-linux-x86_64
- 或使用rpm包安装
shell
rpm -ivh filebeat-6.6.1-x86_64.rpm
② 配置filebeat
- 修改
filebeat.yml配置文件
shell
cp filebeat.yml filebeat.yml_bak
vim filebeat.yml
yaml
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/log/messages
- /var/log/*.log
fields:
service_name: filebeat
log_type: log
service_id: 192.168.100.4
#--------------Elasticsearch output------------------
#(ES方式这里不用,全部注释掉)
#----------------Logstash output---------------------
output.logstash:
hosts: ["192.168.100.3:5044"]
filebeat.prospectors::收集数据
- type: log:指定log类型,从日志文件中读取消息。
- /var/log/messages:指定监控的日志文件
fields::可以设置一些参数字段添加到output中
hosts::指定logstash的IP和端口
- 启动并加载filebeat配置文件
shell
if $(which filebeat);then
filebeat -e -c filebeat.yml
else
/usr/local/filebeat/filebeat -e -c filebeat.yml
fi
③ Logstash配置接收Beats
node(logstash)
- 修改logstash配置文件
shell
vim /etc/logstash/conf.d/filebeat.conf
conf
input {
beats { port => 5044 }
}
output {
elasticsearch {
hosts => ["192.168.100.1:9200"]
index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
- 启动并加载logstash配置文件
shell
logstash -f /etc/logstash/conf.d/filebeat.conf
④ Kibana创建索引
- Index Pattern:
filebeat-* - Time field:
@timestamp - Discover 中查看日志
测试filebeat、logstash配置文件问题,和测试filebeat和logstash联通性,如果都没问题基本能成功
shell
# 测试配置合法性
/usr/local/filebeat/filebeat test config -c /usr/local/filebeat/filebeat.yml
/usr/local/filebeat/filebeat test output -c /usr/local/filebeat/filebeat.yml
# 测试文件配置是否正常
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/mysql_tomcat.conf --config.test_and_exit
结语
ELK 核心价值 :解决分布式系统日志分散、检索困难、分析低效的问题,实现 集中化、实时化、可视化 的日志管理。
关键端口与路径:
- Elasticsearch:
9200(HTTP),配置/etc/elasticsearch/elasticsearch.yml - Logstash:
5044(Beats input),配置/etc/logstash/conf.d/*.conf - Kibana:
5601,配置/etc/kibana/kibana.yml - Filebeat: 配置
/etc/filebeat/filebeat.yml
!question\] 请问 ELK 中 Logstash 和 Filebeat 的定位有何不同? Logstash功能强大但资源消耗高,适合复杂过滤与多源整合;Filebeat轻量高效,专注日志采集与可靠传输; 通常两者配合使用(Filebeat → Logstash → ES)。 \[!question\] 为什么 Elasticsearch 集群健康状态为 yellow 仍可正常使用? yellow 表示主分片完整但副本缺失(如单节点集群),不影响读写,但缺乏高可用性。生产环境建议至少 3 节点以实现 green 状态。 \[!question\] Kibana 如何实现日志的时间范围筛选? 依赖日志中的 `@timestamp` 字段(由 Logstash/Filebeat 自动添加),在 Discover 或 Dashboard 中通过时间选择器动态过滤。
ini
ERROR: [1] bootstrap checks failed
[1]: max number of threads [3870] for user [elasticsearch] is too low, increase to at least [4096]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/elasticsearch/logs/my-elk-cluster.log
原因:
Elasticsearch 启动时报错 max number of threads [3870] for user [elasticsearch] is too low, increase to at least [4096],是由于系统对 elasticsearch 用户的进程/线程数限制低于要求值。
解决方法:
- 第一步:编辑
/etc/security/limits.conf,添加
conf
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096
- 增加内存映射区域
shell
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sysctl -p
- 第二步:通过
su - elasticsearch以登录 shell 切换用户。 - 第三步:执行
ulimit -u验证输出为4096,执行ulimit -n验证输出为65535。 - 第四步:在此会话中启动 Elasticsearch,即可通过检查。
bash
ulimit -u 4096
bash: ulimit: max user processes: 无法修改 limit 值: 不允许的操作
原因:
手动运行 ulimit -u 4096 失败并提示"无法修改 limit 值",是因为当前 shell 无权提升硬限制,且未从 PAM 加载配置。
解决方法:
- 第一步:确保
/etc/pam.d/common-session包含
text
session required pam_limits.so
如果不包含:
shell
echo "session required pam_limits.so" | tee -a /etc/pam.d/common-session
- 第二步:必须通过登录 shell(如
su - elasticsearch)切换用户,才能加载limits.conf设置 - 第三步:在该会话中无需手动设置
ulimit,系统已自动应用配置