Filebeat 如何从日志行(message)中解析出字段?
Filebeat 解析日志行的三种方式:dissect 处理器按固定模式切分、grok 正则提取、JSON 日志用 decode_json_fields。本文给出三种写法的配置示例与选型建议。
三种方式按日志格式选:结构化 JSON 日志用 decode_json_fields;格式固定的文本用 dissect(快);复杂不规则文本用 grok(灵活但慢)。
方式一:JSON 日志——decode_json_fields
processors:
- decode_json_fields:
fields: ["message"]
target: "" # 解析到顶层;填 "parsed" 则放到 parsed 下
overwrite_keys: true
日志 {"user":"tom","action":"login"} 解析后 user、action 成为独立字段,可直接检索。
方式二:固定格式——dissect
processors:
- dissect:
tokenizer: "%{timestamp} %{level} %{service} %{msg}"
field: "message"
target_prefix: "app"
2024-01-01 INFO order 下单成功 → app.level=INFO、app.service=order。dissect 是简单切分,性能远好于 grok。
方式三:复杂文本——grok
processors:
- grok:
field: message
patterns:
- '%{IP:client_ip} - %{USER:user} \[%{HTTPDATE:ts}\] "%{WORD:method} %{URIPATH:path}" %{NUMBER:status:int}'
内置丰富预置模式(IP、WORD、NUMBER、HTTPDATE……),适合 Nginx/Apache 等格式明确的日志。
观测云对照
观测云 DataKit Pipeline 的 grok 函数同样内置大量预置模式,且 Pipeline 在控制台可在线调试——粘贴样例日志立即看到解析结果,省去反复重启 Filebeat 验证的过程。
常见问题(FAQ)
Q:dissect 和 grok 怎么选? 格式稳定用 dissect(快 5-10 倍);需要模式复用与类型转换用 grok。
Q:解析失败的日志会怎样? 默认带错误标记继续发送;想丢弃加 drop_event 条件判断错误字段。