Elasticsearch 数据管道(Ingest Pipeline) 是实现 数据预处理、清洗、转换 的核心功能。它允许你在文档写入 Lucene 之前,对数据进行一系列处理,无需依赖外部系统。
结合 Logstash,可构建完整的 ETL(Extract-Transform-Load)流程,适用于日志分析、数据集成、数据标准化等场景。
本文将为你提供一份 全面、可落地的 Ingest Pipeline 详解,涵盖内置处理器、Grok 解析、与 Logstash 集成等核心内容。
一、什么是 Ingest Pipeline?
Ingest Pipeline 是 Elasticsearch 内置的轻量级数据处理引擎,由多个 处理器(Processor) 组成,按顺序执行。
- 执行时机:文档写入前(
index、create、bulk操作); - 执行节点:Ingest Node(可与 Data Node 共存);
- 优势:无需外部处理,低延迟,与索引操作原子化。
✅ 适用于:字段重命名、类型转换、日志解析、敏感字段脱敏等。
二、Ingest Pipeline 核心概念
1. 基本结构
{
"description": "Parse web server logs",
"processors": [
{ "grok": { ... } },
{ "date": { ... } },
{ "remove": { ... } }
]
}
2. 处理器(Processor)类型
| 处理器 | 用途 |
|---|---|
grok | 正则解析日志(如 Nginx、Syslog) |
date | 解析时间字符串为 date 类型 |
rename | 字段重命名 |
convert | 类型转换(string → integer) |
remove | 删除字段 |
set | 设置字段值 |
script | 执行 Painless 脚本 |
append | 追加数组元素 |
split / join | 字符串分割与合并 |
三、常用处理器详解
1. grok:日志解析(最常用)
用于解析非结构化日志,如 Nginx 访问日志。
示例:Nginx 日志
192.168.1.1 - - [01/Jun/2024:10:00:00 +0800] "GET /api/user HTTP/1.1" 200 1024 "Mozilla/5.0" "127.0.0.1"
Pipeline 配置
PUT /_ingest/pipeline/nginx-access-pipeline
{
"description": "Parse Nginx access logs",
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \\[%{HTTPDATE:timestamp}\\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} %{NUMBER:bytes:int} \"%{DATA:agent}\" \"%{IPORHOST:forwarded_for}\""
]
}
},
{
"date": {
"field": "timestamp",
"formats": ["dd/MMM/yyyy:HH:mm:ss Z"],
"target_field": "@timestamp"
}
},
{
"rename": {
"field": "message",
"target_field": "raw_message"
}
},
{
"remove": {
"field": "timestamp"
}
}
]
}
✅
patterns可使用内置变量(如%{IP}、%{WORD})。
2. date:时间解析
将字符串转换为 date 类型,用于搜索和聚合。
{
"date": {
"field": "log_timestamp",
"formats": ["yyyy-MM-dd HH:mm:ss", "ISO8601"],
"target_field": "@timestamp"
}
}
3. rename:字段重命名
{
"rename": {
"field": "old_field_name",
"target_field": "new_field_name"
}
}
4. convert:类型转换
{
"convert": {
"field": "status_code",
"type": "integer"
}
}
支持:integer, long, double, boolean, string
5. remove:删除字段
{
"remove": {
"field": ["temp_field", "debug_info"]
}
}
6. script:Painless 脚本(高级)
执行自定义逻辑。
{
"script": {
"lang": "painless",
"source": """
ctx.level = ctx.status >= 500 ? 'error' :
ctx.status >= 400 ? 'warn' : 'info';
"""
}
}
⚠️ 脚本性能较低,慎用。
四、使用 Ingest Pipeline
1. 写入时指定 pipeline
PUT /logs-2024/_doc/1?pipeline=nginx-access-pipeline
{
"message": "192.168.1.1 - - [01/Jun/2024:10:00:00 +0800] \"GET /api/user HTTP/1.1\" 200 1024"
}
2. 在索引模板中默认启用
PUT /_index_template/logs-template
{
"index_patterns": ["logs-*"],
"template": {
"settings": {
"index.default_pipeline": "nginx-access-pipeline"
}
}
}
所有匹配
logs-*的索引自动使用该 pipeline。
五、结合 Logstash 实现复杂 ETL 流程
虽然 Ingest Pipeline 轻量高效,但 复杂 ETL(如多源聚合、窗口计算、流处理)仍需 Logstash。
1. 架构设计
+------------------+ +---------------------+
| 日志源 (File, Kafka) | --> | Logstash |
+------------------+ +----------+----------+
|
v
+--------------------------+
| 复杂 ETL 处理 |
| - 多源 Join |
| - 聚合统计 |
| - 外部 API 调用 |
+------------+-------------+
|
v
+--------------------------+
| Elasticsearch |
| - 使用 Ingest Pipeline |
| 做最后清洗 |
+--------------------------+
2. Logstash 配置示例(logstash.conf)
input {
file {
path => "/var/log/nginx/access.log"
start_position => "beginning"
}
}
filter {
# 使用 Grok 解析
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
# 时间解析
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
# 类型转换
mutate {
convert => { "response" => "integer" }
rename => { "clientip" => "src_ip" }
}
# 条件处理
if [response] >= 500 {
mutate { add_tag => [ "error" ] }
}
# 调用外部服务(如 GeoIP)
geoip {
source => "src_ip"
}
}
output {
elasticsearch {
hosts => ["http://es-node1:9200"]
index => "logs-nginx-%{+YYYY.MM.dd}"
pipeline => "final-cleanup-pipeline" # 可选:再走一次 Ingest Pipeline
}
}
3. Ingest Pipeline 与 Logstash 的分工建议
| 场景 | 推荐方案 |
|---|---|
| 简单字段清洗 | ✅ Ingest Pipeline |
| 日志解析(Grok) | ✅ 两者皆可 |
| 多源数据 Join | ❌ Ingest → ✅ Logstash |
| 流式聚合(每分钟统计) | ❌ Ingest → ✅ Logstash + Kafka |
| 外部 API 调用(GeoIP) | ❌ Ingest → ✅ Logstash |
| 高吞吐日志采集 | ✅ Beats → Logstash → ES |
六、性能与资源优化
1. Ingest Node 资源分配
- 高 CPU:Grok、Script 处理密集;
- 足够内存:避免 OOM;
- 建议:专用 Ingest Node 或与 Data Node 分离。
2. Pipeline 性能监控
GET /_node/stats/ingest
返回每个 pipeline 的处理次数、失败数、处理时间。
七、最佳实践 checklist ✅
| 项目 | 建议 |
|---|---|
| 简单清洗 | 使用 Ingest Pipeline |
| 复杂 ETL | 使用 Logstash |
| 日志解析 | Grok + 预定义 pattern |
| 时间字段 | 使用 date 处理器 |
| 敏感字段 | 使用 remove 脱敏 |
| Pipeline 复用 | 通过索引模板默认启用 |
| 监控 | 监控 ingest 节点负载与失败率 |

被折叠的 条评论
为什么被折叠?



