Filebeat 如何从日志行(message)中解析出字段?

Filebeat 解析日志行的三种方式:dissect 处理器按固定模式切分、交由 Elasticsearch ingest 或 Logstash 的 grok 正则提取、JSON 日志用 decode_json_fields。本文给出三种写法的配置示例与选型建议。

最佳实践
Filebeat 如何从日志行(message)中解析出字段?封面

三种方式按日志格式选:结构化 JSON 日志用 decode_json_fields;格式固定的文本用 dissect(快);复杂不规则文本用 Elasticsearch ingest pipeline 或 Logstash 的 grok(Filebeat 本身没有该处理器)。

方式一:JSON 日志——decode_json_fields

processors:
  - decode_json_fields:
      fields: ["message"]
      target: "parsed"  # 解析到独立对象,避免覆盖元数据
      overwrite_keys: false

日志 {"user":"tom","action":"login"} 解析后 parsed.user、parsed.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

先在 Elasticsearch 中创建 ingest pipeline(Dev Tools):

PUT _ingest/pipeline/app-grok
{
  "processors": [{
    "grok": {
      "field": "message",
      "patterns": ["%{IP:client_ip} - %{USER:user} \\[%{HTTPDATE:ts}\\] \"%{WORD:method} %{URIPATH:path}\" %{NUMBER:status:int}"]
    }
  }]
}

Filebeat 的 output.elasticsearch 中设置 pipeline: app-grok。

内置丰富预置模式(IP、WORD、NUMBER、HTTPDATE……),适合 Nginx/Apache 等格式明确的日志。

常见问题(FAQ)

Q:dissect 和 grok 怎么选? 格式稳定可用 dissect;需要模式复用与类型转换用 grok。

Q:解析失败的日志会怎样? 行为取决于处理器和配置。decode_json_fields 可设 add_error_key;ingest pipeline 可用 on_failure,未处理的失败可能拒绝文档。不要假设都会带标记继续发送。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台