.* 或 .+❌ 不推荐:
%{DATA:message}✅ 推荐(明确字段含义):
%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}或更进一步:
%{TIMESTAMP_ISO8601:timestamp} %{WORD:level} %{GREEDYDATA:message}❌ 一个 Grok 搞定所有:
%{COMMONAPACHELOG} %{GREEDYDATA:extra}✅ 拆成多步:
grok {
match => { "message" => "%{COMMONAPACHELOG}" }
}
grok {
match => { "message" => "%{GREEDYDATA:extra}" }
}break_on_match当你只需要匹配第一个成功模式时:
grok {
match => { "message" => "%{PATTERN_A}|%{PATTERN_B}" }
break_on_match => true
}❌ 慢:
%{NUMBER:code}✅ 快:
\b%{NUMBER:code}\b或:
^%{TIMESTAMP_ISO8601:ts}if [logtype] == "nginx" {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
}dissect 替代简单 Grokdissect 比 grok 快 5–10 倍
❌:
%{IP:client} %{WORD:method} %{URIPATH:path}✅:
dissect {
mapping => {
"message" => "%{client} %{method} %{path}"
}
}但你可以:
patterns_dir => ["/etc/logstash/patterns"]常见危险写法:
(.*)
(.+)
(.*?)✅ 换成更明确的:
[^ ]+
[^"]+
[0-9]+pipeline.workers: 4
pipeline.batch.size: 500
pipeline.batch.delay: 50在 Logstash 中开启:
logging.level: debug| 场景 | 建议 |
|---|---|
| 高并发日志 | 用 dissect > grok |
| 多格式日志 | 先 if 判断,再 grok |
| 日志格式固定 | 写精确 pattern |
| 历史日志 | 用最少的 grok,尽量预处理 |
| 云原生 / K8s | 在采集端(Fluent Bit)预处理 |
%{DATA:user} %{DATA:action} %{GREEDYDATA:detail}%{USER:user} %{WORD:action} %{DATA:detail}你可以直接贴出:
我可以帮你: