Logstash grok 常用语法和模式速查
Logstash grok 语法速查:%{模式:字段名} 提取字段,常用模式 WORD/NUMBER/INT/FLOAT/TIMESTAMP_ISO8601/LOGLEVEL/GREEDYDATA 等。本文汇总常用模式与示例。
grok 的基本语法是 %{模式名:目标字段名}——用预定义正则模式匹配内容并提取为字段。模式可组合成完整的一行日志格式。
最常用模式
| 模式 | 匹配内容 | 示例 |
|---|---|---|
%{WORD} |
单个单词 | hello |
%{NUMBER} |
整数或小数 | 42、3.14 |
%{INT} |
整数 | 42 |
%{FLOAT} |
浮点数 | 3.14 |
%{DATA} |
非贪婪任意字符 | 任意短文本 |
%{GREEDYDATA} |
贪婪任意字符(常放最后) | 剩余全部 |
%{LOGLEVEL} |
日志级别 | INFO、ERROR |
%{TIMESTAMP_ISO8601} |
ISO 8601 时间 | 2024-01-15T10:30:00+08:00 |
%{IP} |
IP 地址 | 192.168.1.1 |
%{HOSTNAME} |
主机名 | web-01 |
%{UUID} |
UUID | 550e8400-... |
%{URIPATH} |
URL 路径 | /api/users |
%{QS} |
带引号的字符串 | "hello" |
内置组合模式
%{COMMONAPACHELOG} # Apache/Nginx 通用访问日志
%{COMBINEDAPACHELOG} # 带 Referer 和 UA 的完整格式
%{SYSLOGLINE} # syslog 行
组合示例
日志行:
2024-01-15 10:30:00 INFO User 42 logged in from 192.168.1.1
grok 模式:
%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} User %{NUMBER:user_id} %{WORD:action} from %{IP:client_ip}
实用技巧
- 只匹配不存字段:
%{NUMBER}不带冒号字段名,只消耗匹配不生成字段; - 类型转换:
%{NUMBER:status:int}直接存为整数; - 在线调试:用 grok debug 工具(如 grokdebug.herokuapp.com)或观测云 Pipeline 在线调试快速验证模式。
观测云对照
观测云 Pipeline 内置同样的 grok 函数和预置模式库,且在控制台中提供在线调试:粘贴真实日志样本即可验证模式是否正确提取字段,无需重启任何服务。
常见问题(FAQ)
Q:GREEDYDATA 和 DATA 的区别?
A:DATA 是非贪婪匹配(尽量少匹配),GREEDYDATA 贪婪匹配(尽量多匹配)。行尾剩余内容用 GREEDYDATA。
Q:模式不匹配的日志会怎样?
A:打上 _grokparsefailure 标签,原始 message 保留,不会丢数据。
Q:特殊字符(方括号、引号)怎么匹配?
A:用反斜杠转义,如 \[;注意 Logstash 配置里反斜杠本身也要转义:^\\[。