在 Ubuntu 上,Filebeat 本身不“写规则”做复杂判断,它的核心职责是采集日志 → 加工(可选) → 发送到目标(Elasticsearch / Logstash / Kafka 等)。
所谓“自定义规则”,通常分为 3 类场景,下面我一步步说清楚,并给你可直接用的配置示例。
| 类型 | 作用 | 配置位置 |
|---|---|---|
| 1. 采集规则 | 指定哪些日志文件、如何读取 | filebeat.inputs |
| 2. 过滤/加工规则 | 丢弃、修改、增加字段 | processors |
| 3. 条件路由规则 | 不同日志发不同地方 | output + when |
filebeat.inputs:
- type: filestream
enabled: true
paths:
- /var/log/nginx/error.log
fields:
log_type: nginx_error
✅ 可自定义:
fieldsmultiline:
type: pattern
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
processors:
- drop_event:
when:
contains:
message: "health check"
processors:
- add_fields:
target: ''
fields:
env: production
app: user-service
processors:
- if:
contains:
message: "ERROR"
then:
- add_fields:
target: ''
fields:
level: error
processors:
- dissect:
tokenizer: "%{ts} %{level} %{msg}"
field: "message"
target_prefix: "log"
结果:
{
"log.ts": "...",
"log.level": "ERROR",
"log.msg": "..."
}
output.elasticsearch:
hosts: ["http://es1:9200"]
indices:
- index: "nginx-%{+yyyy.MM.dd}"
when.contains:
fields.log_type: nginx
output.elasticsearch:
hosts: ["http://es2:9200"]
indices:
- index: "app-%{+yyyy.MM.dd}"
when.contains:
fields.log_type: app
⚠️ 注意:Filebeat 只能写多个 output 之一生效,复杂路由建议走 Logstash
Filebeat(采集 + 简单过滤)
↓
Logstash(复杂规则 / 解析)
↓
Elasticsearch
Logstash 示例规则:
filter {
if [log_type] == "nginx" {
grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
}
}
/etc/filebeat/filebeat.yml
检查配置:
filebeat test config
filebeat test output
我可以给你精准配置,例如:
你现在是 采集什么日志?想做什么规则?