grok 调用:每个 grok 都会进行正则匹配,尽量合并规则。break_on_match => true(默认开启):一旦匹配成功就停止后续匹配,减少不必要的尝试。grok {
match => { "message" => [ "pattern1", "pattern2", "pattern3" ] }
break_on_match => true
}dissector,性能比 Grok 高数倍。dissector {
mapping => { "message" => "%{ip} %{timestamp} %{loglevel} %{msg}" }
}.+、(.*?) 等可能产生大量回溯的写法。❌ 不推荐:
%{DATA:msg}.*✅ 推荐:
%{GREEDYDATA:msg}# patterns/my_patterns
MY_PATTERN \d{4}-\d{2}-\d{2}grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{MY_PATTERN:date}" }
}mutate {
strip => ["message"]
gsub => [ "message", "\r", "" ]
}^ 和 $ 限制匹配位置,避免误匹配。grok {
match => { "message" => "^%{TIMESTAMP_ISO8601:ts} %{LOGLEVEL:level}" }
}snake_case 或 camelCase。field1、data)。✅ 推荐:
%{IP:client_ip} %{NUMBER:response_time:int}:int、:float 直接转换,减少后续 mutate。%{NUMBER:status_code:int}_grokparsefailure 追踪未匹配日志,便于发现新问题。if "_grokparsefailure" in [tags] {
mutate {
add_field => { "raw_log" => "%{message}" }
}
}| 注意点 | 建议 |
|---|---|
| 高并发场景 | 避免在 Grok 中使用复杂正则 |
| 日志量大 | 用 Dissector + Grok 组合 |
| 多格式日志 | 按日志类型分流后再 Grok |
| ES 性能 | Grok 字段过多会增加索引压力 |
能用 Dissector 就不用 Grok
Grok 正则要具体,不要贪心用通配
规则从简、顺序从频、失败必查
如果你有 具体日志样例或 Logstash 配置,我可以帮你针对性优化 Grok 表达式。