ELK技术栈全套学习笔记(Elasticsearch+Logstash+Filebeat)
一、ELK技术栈整体概述
ELK 是一套开源的分布式日志收集、清洗、存储、检索、可视化分析解决方案,核心由三大组件组成,各司其职、协同工作,是企业日志运维、实时数据分析、业务监控的核心技术栈。
-
Filebeat:轻量级日志采集器,部署在服务器端,负责采集各类日志文件、系统指标,资源占用极低,适配大规模集群。
-
Logstash:数据处理引擎,接收 Filebeat 采集的数据,完成过滤、清洗、解析、脱敏、字段转换等操作。
-
Elasticsearch(ES):分布式搜索分析引擎,存储 Logstash 处理后的结构化数据,提供毫秒级检索、聚合分析能力。
-
补充:Kibana:可视化平台,用于查询 ES 数据、制作监控面板、日志检索、数据可视化展示。
标准数据流转链路:业务日志 → Filebeat(采集)→ Logstash(清洗处理)→ Elasticsearch(存储索引)→ Kibana(可视化查询分析)
二、Elasticsearch 7.x 核心详解
2.1 核心定位与核心能力
Elasticsearch 是基于 Apache Lucene 构建的开源分布式搜索分析引擎,专为海量结构化/非结构化数据设计,解决传统数据库在全文检索、实时聚合分析场景的性能瓶颈。
核心能力:毫秒级实时数据分析、全文检索、PB级海量数据存储、水平无限扩容、复杂聚合统计。
2.2 核心架构概念
| 核心概念 | 详细说明 |
|---|---|
| 节点(Node) | ES 独立运行实例,分为主节点、数据节点、协调节点、预处理节点等角色,单节点可承担多角色 |
| 集群(Cluster) | 多个节点组成的分布式集群,统一对外提供服务,保证高可用 |
| 索引(Index) | 逻辑数据容器,类比传统数据库的数据表,7.x 版本废除多 type 设计,一个索引仅对应一种数据结构 |
| 分片(Shard) | 数据最小存储单元,分为主分片(Primary)和副本分片(Replica),副本用于故障容错、读写负载分担 |
2.3 核心特性与优势
-
分布式高可用:基于 Raft 共识协议(7.x 替代旧版 Zen Discovery)管理集群,无单点故障,支持滚动扩容。
-
无固定表结构:Schema-free 设计,支持 JSON 文档存储,适配多变的日志数据格式。
-
高性能检索:基于倒排索引机制,全文检索速度远超传统数据库,支持 TF-IDF/BM25 评分算法。
-
实时读写:内存缓存+Translog 机制,实现数据秒级写入、毫秒级查询。
2.4 7.x 版本重大更新
-
废除多 type 设计,简化数据模型,统一索引数据结构。
-
重构集群协调层,移除
minimum_master_nodes配置,内置 Raft 分布式共识算法。 -
Top-K 查询优化,节省30%堆内存,并发处理能力提升2倍。
-
默认开启 TLS 通信,强化 RBAC 权限控制,提升集群安全性。
-
新增稀疏字段、地理图形查询、Rank 特征字段等数据类型。
2.5 核心配置文件详解
2.5.1 核心配置文件路径
-
主配置:
/etc/elasticsearch/elasticsearch.yml -
JVM 内存配置:
/etc/elasticsearch/jvm.options -
日志配置:
/etc/elasticsearch/log4j2.properties
2.5.2 elasticsearch.yml 核心配置(生产常用)
Plain
# 集群基础配置
cluster.name: my-production-cluster # 集群名称,同集群节点必须一致
node.name: ${HOSTNAME} # 节点名称
node.attr.rack: r1 # 自定义节点属性,用于分片分配
# 节点角色配置
node.master: true # 可作为主节点
node.data: true # 可存储数据
node.ingest: true # 开启数据预处理
node.ml: false # 关闭机器学习(需付费许可)
# 路径配置
path.data: /var/lib/elasticsearch # 数据存储路径
path.logs: /var/log/elasticsearch # 日志存储路径
# 网络配置
network.host: [_local_, _site_] # 绑定本地及内网IP
http.port: 9200 # 客户端访问端口
transport.port: 9300 # 节点间通信端口
# 集群发现与引导
cluster.initial_master_nodes: ["master-node-1","master-node-2"] # 初始主节点
discovery.seed_hosts: ["192.168.1.10:9300","192.168.1.11:9300"]
# 索引默认配置
index.number_of_shards: 3 # 默认主分片数
index.number_of_replicas: 1 # 默认副本分片数
# 磁盘水位线(防止磁盘爆满)
cluster.routing.allocation.disk.watermark.low: 85%
cluster.routing.allocation.disk.watermark.high: 90%
cluster.routing.allocation.disk.watermark.flood_stage: 95%
# 生产必配:禁用swap,提升性能
bootstrap.memory_lock: true
# 安全配置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
2.5.3 jvm.options 核心配置
核心原则:堆内存 Xms/Xmx 必须一致,生产环境建议不超过物理内存的50%,最大不超过31G。
Plain
# 内存配置
-Xms4g
-Xmx4g
# 垃圾回收配置
-XX:+UseG1GC
-XX:G1ReservePercent=25
-XX:InitiatingHeapOccupancyPercent=30
# 异常日志配置
-XX:+HeapDumpOnOutOfMemoryError
-Dlog4j2.disable.jmx=true
2.6 生产环境部署检查清单
-
禁用 Swap 分区,开启内存锁
bootstrap.memory_lock: true -
拆分节点角色(主节点、数据节点、协调节点分离)
-
开启 SSL 加密通信、RBAC 权限管控
-
文件描述符数量大于65536
-
数据目录权限仅 elasticsearch 用户可访问
-
配置索引快照备份策略
2.7 常用集群操作命令
Plain
# 查看集群健康状态
curl -XGET "localhost:9200/_cluster/health?pretty"
# 查看集群节点状态
curl -XGET "localhost:9200/_cat/nodes?v"
# 创建自定义索引
curl -XPUT "localhost:9200/my-index" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}'
# 批量写入数据
curl -XPOST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
'
三、Logstash 核心详解
3.1 核心作用
Logstash 是开源数据采集处理引擎,核心负责多源数据接收、数据清洗、格式解析、字段转换、数据脱敏、路由分发,承接 Filebeat 采集的原始日志,输出结构化数据到 Elasticsearch。
三大核心特性:数据源多样化、数据处理灵活、输出目标可配置。
3.2 核心配置结构(三段式)
所有 Logstash 配置文件均由 **input(输入)、filter(过滤处理)、output(输出)**三部分组成,缺一不可。
3.2.1 input 输入模块(定义数据来源)
支持文件、TCP/UDP、Kafka、MySQL、Beats、HTTP 等多种数据源,生产最常用 beats 插件(对接 Filebeat)。
Plain
# 对接Filebeat输入配置
input {
beats {
port => 5044 # 固定端口,与Filebeat输出端口一致
}
}
# 文件输入配置
input {
file {
path => "/var/log/nginx/*.log"
start_position => "beginning"
sincedb_path => "/dev/null" # 不记录读取位置,每次从头读取
}
}
3.2.2 filter 过滤模块(核心数据处理)
用于解析日志、提取字段、修改数据、过滤无效数据,是 Logstash 最核心的功能模块。
Plain
filter {
# grok:解析非结构化日志,提取自定义字段(最常用)
grok {
match => { "message" => '%{IPORHOST:clientip} - %{USERNAME:ident} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request}" %{NUMBER:response}' }
}
# date:格式化时间戳
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp"
}
# mutate:字段修改、类型转换、字段删除
mutate {
convert => { "response" => "integer" } # 字符串转数字
remove_field => ["message"] # 删除原始日志字段
}
}
3.2.3 output 输出模块(定义数据去向)
支持输出到 Elasticsearch、Kafka、Redis、文件、控制台,生产核心输出 ES,控制台输出用于调试。
Plain
output {
# 按标签分类输出到不同ES索引
if "nginx1" in [tags] {
elasticsearch {
hosts => ["192.168.166.9:9200"]
index => "nginx1-%{+YYYY.MM.dd}" # 按天自动分索引
}
}
if "nginx2" in [tags] {
elasticsearch {
hosts => ["192.168.166.9:9200"]
index => "nginx2-%{+YYYY.MM.dd}"
}
}
# 调试:控制台输出结构化日志
stdout {
codec => rubydebug
}
}
3.3 常用核心插件
3.3.1 输入插件
-
beats:对接 Filebeat/Metricbeat,生产首选,轻量高效。
-
file:直接读取服务器本地日志文件。
-
jdbc:对接 MySQL、Oracle 等数据库,同步业务数据。
-
kafka:消费 Kafka 消息队列数据,适配高并发场景。
3.3.2 过滤插件
-
grok:正则解析非结构化日志,自定义提取字段。
-
date:校正日志时间戳,统一 ES 时间格式。
-
mutate:字段增删、类型转换、字符串替换、数据修改。
-
json:解析 JSON 格式日志,自动拆分字段。
3.3.3 输出插件
-
elasticsearch:核心输出,对接 ES 存储数据。
-
stdout:控制台输出,仅用于测试调试。
-
kafka/redis:数据中转,削峰填谷。
3.4 条件判断语法
用于实现数据分流、精准过滤,支持 if/unless、多条件组合、正则匹配。
Plain
# 1、基础if判断
if [level] == "ERROR" {
mutate { add_tag => ["error_log"] }
}
# 2、正则匹配
if [message] =~ /timeout|refuse/ {
mutate { add_tag => ["exception"] }
}
# 3、多条件与或判断
if ([level] == "WARN" && [status] > 500) || [ip] == "127.0.0.1" {
drop { } # 丢弃无效日志
}
# 4、unless反向判断
unless [service] == "nginx" {
drop { }
}
四、Filebeat 核心详解
4.1 核心定位
Filebeat 是 Elastic 官方轻量级日志采集器,专为轻量化、低资源、高稳定设计,部署在所有业务服务器节点,替代 Logstash 做前端采集,避免资源占用过高影响业务。
核心优势:内存占用极低、支持断点续传、自动监控日志文件新增内容、支持标签分类、适配容器化环境。
4.2 完整核心配置
Filebeat 核心流程:采集日志 → 打标签分类 → 输出到 Logstash/Elasticsearch/Kafka
Plain
# 1、日志采集配置
filebeat.inputs:
- type: filestream
paths:
- /var/log/nginx/*.log # 采集的日志路径
exclude_files: [".gz"] # 排除压缩日志
start_position: beginning # 首次启动从头读取
tags: ["nginx1"] # 自定义标签,用于Logstash分流
# 2、输出配置(优先输出到Logstash)
output.logstash:
hosts: ["192.168.166.9:5044"] # 对接Logstash监听端口
bulk_max_size: 2048 # 批量发送条数
compression_level: 3 # 数据压缩级别
# 3、备选:直接输出到ES(无需Logstash)
# output.elasticsearch:
# hosts: ["localhost:9200"]
# index: "nginx-direct-%{+YYYY.MM.dd}"
# 4、日志配置
logging.level: info
logging.to_files: true
logging.files.path: /var/log/filebeat
logging.files.keepfiles: 7
4.3 常用内置变量(日志字段提取)
可直接用于索引命名、字段自定义、日志标记,是ELK自定义日志格式的核心变量:
-
{@timestamp}:日志事件标准时间戳 -
{host.name}:日志采集主机名 -
{message}:日志原始内容 -
{log.file.path}:日志文件绝对路径 -
{+yyyy.MM.dd}:年月日时间格式(用于按天分索引) -
{fields.custom_field}:自定义扩展字段 -
{container.id}/{container.name}:容器日志专属变量
4.4 核心特性
-
断点续传:自动记录日志读取位置,重启后不会重复采集、不会漏采。
-
自动轮转适配:支持日志切割、压缩、新增文件自动识别。
-
标签分流:通过自定义标签,实现不同业务日志分类传输。
-
低资源消耗:单节点可支撑10万+/秒日志采集,CPU内存占用可忽略。
五、ELK 完整实战工作流程
-
采集阶段:业务服务器部署 Filebeat,采集 Nginx、应用、系统日志,添加业务标签。
-
传输阶段:Filebeat 将原始日志批量发送至 Logstash 5044 端口。
-
清洗阶段:Logstash 通过 grok 解析日志、校正时间、转换字段、过滤无效数据。
-
分流存储:根据日志标签,将不同业务日志写入 ES 不同日期索引。
-
可视化分析:Kibana 读取 ES 索引数据,实现日志检索、异常监控、数据统计可视化。
六、核心知识点总结
-
组件分工核心:Filebeat 只管采集、Logstash 只管清洗、ES 只管存储检索、Kibana 只管可视化。
-
生产最佳架构:Filebeat + Logstash + ES 集群,解耦采集与清洗,适配高并发、大规模日志场景。
-
7.x 关键变化:废除多 type、Raft 集群协议、默认安全加密、性能大幅优化。
-
性能优化核心:ES 禁用 Swap、JVM 内存均衡、日志按天分索引、批量传输数据。
-
故障保障:ES 副本分片容错、Filebeat 断点续传、集群多节点高可用。