参考:Beats 家族、Logstash 插件与易错点
基于 ELK Stack 8.x · 核于 2026-08
速查
- ELK = Elasticsearch(存+检索)+ Logstash(解析)+ Kibana(UI)+ Beats(采集)。
- 流水线:日志文件 → Filebeat → Logstash(grok/mutate)→ ES(倒排索引)→ Kibana(Discover)。
- Beats 家族:Filebeat(日志)/ Metricbeat(指标)/ Heartbeat(探活)/ Packetbeat(网络)/ Auditbeat(审计)/ Winlogbeat(Windows)。
- Logstash filter 三大插件:grok(正则解析)/ mutate(改字段)/ date(时间解析)。
- ES 核心:倒排索引(全文检索)+ 分片副本(水平扩展+HA)+ mapping(text/keyword)+ ILM(生命周期)。
- text vs keyword:text 分词(全文检索)/ keyword 不分词(精确匹配+聚合)——错配导致检索失效。
- 与 Loki 对比:ELK 全文检索强但存储贵(约 10 倍),Loki 省存储但弱检索。
- 不做的事:指标监控(归 Prometheus)、分布式追踪(归 Jaeger/Tempo)。
一、Beats 家族速查
| Beat | 采集对象 | 典型用途 | 常用度 |
|---|---|---|---|
| Filebeat | 日志文件 | 应用/系统日志采集 | ⭐⭐⭐⭐⭐ |
| Metricbeat | 系统/服务指标 | CPU/MySQL/Redis 指标 | ⭐⭐⭐⭐ |
| Heartbeat | 服务可用性 | uptime/延迟探活 | ⭐⭐⭐ |
| Packetbeat | 网络流量 | DB/HTTP 抓包分析 | ⭐⭐ |
| Auditbeat | 审计数据 | Linux audit/文件完整性 | ⭐⭐ |
| Winlogbeat | Windows 事件 | Windows 服务器日志 | ⭐⭐ |
| Functionbeat | 云函数 | Serverless 采集 | ⭐ |
| Journalbeat | systemd journal | systemd 日志 | ⭐⭐ |
二、Logstash filter 常用插件
| 插件 | 作用 | 示例 |
|---|---|---|
| grok | 正则解析非结构化日志 | %{TIMESTAMP_ISO8601:ts} %{LOGLEVEL:level} |
| mutate | 字段操作(rename/add/remove/convert) | convert => {status => integer} |
| date | 时间字段解析到 @timestamp | match => [ts, ISO8601] |
| json | JSON 字符串解析成对象 | source => message |
| geoip | IP 转地理信息 | source => client_ip |
| kv | key=value 格式解析 | 自动解析 k=v k2=v2 |
| ruby | 执行 Ruby 代码(复杂逻辑) | 自定义处理 |
| split | 数组拆成多条 event | field => tags |
| drop | 丢弃 event | 过滤无用日志 |
| clone | 复制 event 到多 output | 一份日志多路处理 |
三、grok 预置模式速查
| 模式 | 匹配 | 示例 |
|---|---|---|
TIMESTAMP_ISO8601 | ISO8601 时间戳 | 2026-08-09T12:00:00Z |
LOGLEVEL | 日志级别 | ERROR/INFO/WARN |
IP | IPv4/IPv6 | 192.168.1.1 |
IPORHOST | IP 或主机名 | es-cluster-1 |
NUMBER | 数字 | 1234 |
WORD | 单词 | order |
DATA | 非贪婪任意 | (少量字符) |
GREEDYDATA | 贪婪任意 | (剩余全部) |
UUID | UUID | 550e8400-... |
EMAILADDRESS | 邮箱 | a@b.com |
URI | URI | /api/order |
HTTPDATE | HTTP 日期 | 09/Aug/2026:12:00:00 |
四、ES mapping 类型速查
| 类型 | 用途 | 示例字段 |
|---|---|---|
| text | 分词,全文检索 | message、description |
| keyword | 不分词,精确匹配+聚合 | level、service、status |
| long/integer | 整数聚合 | status_code、count |
| float/double | 浮点聚合 | latency_ms |
| boolean | 布尔 | success |
| date | 时间 | @timestamp |
| ip | IP(范围查询) | client_ip |
| object | 嵌套对象 | user.name |
| nested | 嵌套数组(独立查询) | items[] |
| geo_point | 地理坐标 | location |
五、ES 聚合(aggregation)速查
json
{
"size": 0,
"query": { "match_all": {} },
"aggs": {
"by_service": {
"terms": { "field": "service.keyword", "size": 10 } // 分桶
},
"error_rate_over_time": {
"date_histogram": { // 时间分桶
"field": "@timestamp",
"fixed_interval": "1h"
},
"aggs": {
"avg_latency": { "avg": { "field": "latency_ms" } } // 子聚合
}
},
"distinct_users": { "cardinality": { "field": "user_id" } } // 去重计数
}
}- bucket aggregation:terms(分桶)/ histogram / date_histogram / range / filter。
- metric aggregation:avg / sum / max / min / cardinality(去重)/ stats / percentiles。
六、Kibana KQL(Kibana Query Language)速查
# 基本查询
level:error # 字段:值
level:error and service:"order service" # AND
level:error or level:warn # OR
NOT level:info # NOT
message:"user not found" # 全文短语
status:[400 TO 499] # 数值范围
@timestamp > "now-1h" # 时间范围
client_ip:192.168.1.* # 通配符
exists(field) # 字段存在七、ILM(Index Lifecycle Management)配置
json
PUT _ilm/policy/app-logs-policy
{
"policy": {
"phases": {
"hot": { // 0-7 天:写入 + 查询
"actions": {
"rollover": { "max_age": "1d", "max_size": "50gb" }
}
},
"warm": { // 7-30 天:只查询(慢盘)
"min_age": "7d",
"actions": { "shrink": { "number_of_shards": 1 } }
},
"cold": { // 30-90 天:少查(更慢盘)
"min_age": "30d",
"actions": { "freeze": {} }
},
"delete": { // 90 天后:删除
"min_age": "90d",
"actions": { "delete": {} }
}
}
}
}八、易错点清单
- 「ELK 做指标监控」:错。指标监控选 Prometheus(PromQL 专精、Pull、告警强),ELK 的 Metricbeat 是补充。
- 「ELK 做分布式追踪」:错。追踪归 Jaeger/Tempo(有 trace/span 模型),ELK 是扁平文档。
- 「Loki 替代 ELK 所有场景」:错。要全文模糊检索/复杂聚合选 ELK,Loki 弱检索。
- 「把 level 字段设成 text」:错。text 会分词,精确匹配
level:error失败——level 应设 keyword。 - 「Filebeat 必须配 Logstash」:错。Filebeat 可直接发 ES(用 Ingest Node 解析),小规模省组件。
- 「ES 堆内存越大越好」:错。堆超过 32GB 会失去指针压缩(oops),反而变慢——建议 ≤31GB。
- 「Logstash 每台机器都跑」:不推荐。Logstash 重(JVM),常只跑少数实例集中解析,每台机器跑 Filebeat(轻)。
- 「grok 解析不耗资源」:错。grok 是正则,CPU 密集,日志量大时 Logstash 资源消耗明显。
- 「ES 集群无需调分片」:错。分片过多(每个索引 1 主分片)查询慢,分片过少(每分片 >50GB)难均衡——按数据量与节点数设计。
- 「Kibana 和 Grafana 等价」:错。Kibana 专注 ES 数据源(日志检索强),Grafana 多数据源(指标可视化强),各有侧重。
- 「ILM 没必要」:错。无 ILM 索引无限增长会撑爆磁盘——必须设 hot/warm/cold/delete 控制成本。
- 「Beats 和 Promtail 等价」:不完全。Filebeat 发 ES/Logstash(ELK 栈),Promtail 发 Loki(Grafana 栈),下游不同。