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" } }
}常用模式速查
| 模式 | 匹配内容 | 典型字段 |
|---|---|---|
| IPORHOST | IP 或主机名 | 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 消耗。