首页/云/可观测性速查/Grok 解析非结构化日志
日志平台52 条

Grok 解析非结构化日志

grok 用模式库把文本拆成字段:%{TIMESTAMP_ISO8601:ts} 这类“模式:字段名”的写法即取即用,自定义模式可放 patterns 目录。

可观测性速查云更新于 2026-10-13

Grok 解析是什么

grok 用模式库把非结构化文本拆成字段:%{TIMESTAMP_ISO8601:ts} 这类「模式:字段名」的写法即取即用,底层是正则但可读性高得多。自定义模式可以放进 patterns 目录并引用,是 Logstash 处理 Nginx、应用访问日志等半结构化文本的主力插件。

基本信息

所属Logstash filter 插件
基本写法%{模式名:字段名}
常用模式IPORHOST、HTTPDATE、NUMBER、WORD、URIPATHPARAM、GREEDYDATA
类型转换模式名后缀 :int / :float
自定义模式patterns_dir 目录 + patterns_files_glob
失败标记tag_on_failure(默认 _grokparsefailure)

典型使用场景

  • 解析 Nginx access log,提取客户端 IP、方法、路径与状态码
  • 拆解应用自定义格式的日志行,抽取出耗时与业务字段
  • 从报文里提取编号,与业务系统数据做关联
  • 把状态码与字节数转成数值类型,支持范围查询与聚合
  • 对多行日志先做合并再解析,还原完整异常堆栈
  • 用自定义模式复用团队内部特有的日志格式

解析 Nginx 访问日志

解析 Nginx 访问日志
filter {
  grok {
    match => {
      "message" => "%{IPORHOST:clientip} - - \[%{HTTPDATE:time}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:ver}\" %{NUMBER:status:int} %{NUMBER:bytes:int}"
    }
    tag_on_failure => ["_grokparsefailure"]   # 失败时打标签而非丢弃
  }
  # 解析成功后可用 mutate 做单位换算与字段裁剪
  mutate { convert => { "bytes" => "integer" } }
}

常用模式速查

模式匹配内容典型字段
IPORHOSTIP 或主机名clientip
HTTPDATE常见日期格式time
NUMBER数字(可加 :int)status、bytes
WORD单个词method
GREEDYDATA剩余全部内容msg
先对着 Grok Debugger 验证再上线;解析失败时保留原 message 并打标签,避免数据丢失且便于事后回补。
自定义模式用 patterns_dir 引入,命名带团队前缀可避免与内置模式冲突。
高流量场景下复杂 grok 会抬高 CPU:能先用条件判断跳过无关日志的,就不要对全部日志无条件解析。
字段类型要在解析时一并声明(:int、:float),否则状态码与字节数会以字符串形式入库,范围查询会得到意外结果。
dissect 是更快的替代方案:分隔符格式稳定的日志用 dissect 比 grok 省 CPU,格式多变的才用 grok。
多个 match 条目会依次尝试,命中即停止;把最精确的模式放前面能减少无效匹配与 CPU 消耗。

易错点

  • 正则贪婪与转义问题让解析时对时错,固定样例集回归验证
  • 对高流量日志跑复杂 grok 会抬高 CPU,必要时先做条件判断再解析
  • 解析失败不打标签会让问题日志混在正常数据里,排查时无从下手
  • 漏写类型转换会让数字以字符串入库,范围查询与聚合结果都会出错
  • 多个 grok 依次尝试时,前一个半匹配成功会掩盖后面更精确的模式
  • 格式稳定的日志硬上 grok 会增加无谓开销,改用 dissect 往往更快更省

数据来源与参考

  • Elastic 官方文档 · Grok filter
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌