Grok 是 Logstash 中最强大和最常用的过滤器之一,它用于将非结构化的文本数据解析为结构化的数据格式。
Grok 基本概念
Grok 基于正则表达式,通过预定义的模式将文本解析为字段。Grok 语法格式为:
shell%{PATTERN:field_name}
其中:
- PATTERN:预定义的模式名称
- field_name:解析后存储的字段名称
常用 Grok 模式
基础模式
%{NUMBER:num}:匹配数字%{WORD:word}:匹配单词%{DATA:data}:匹配任意数据%{GREEDYDATA:msg}:贪婪匹配剩余数据%{IP:ip}:匹配 IP 地址%{DATE:date}:匹配日期
日志模式
%{COMBINEDAPACHELOG}:Apache 组合日志格式%{COMMONAPACHELOG}:Apache 通用日志格式%{NGINXACCESS}:Nginx 访问日志格式%{SYSLOGBASE}:系统日志基础格式
实际应用示例
1. Apache 访问日志解析
conffilter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } }
解析后会生成以下字段:
- clientip
- ident
- auth
- timestamp
- verb
- request
- httpversion
- response
- bytes
- referrer
- agent
2. 自定义日志格式
假设日志格式为:
shell2024-02-21 10:30:45 [INFO] User john.doe logged in from 192.168.1.100
配置如下:
conffilter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:level}\] %{GREEDYDATA:message}" } } }
3. 复杂日志解析
conffilter { grok { match => { "message" => "%{IP:client_ip} - %{USER:user} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response_code} %{NUMBER:bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" } } }
自定义 Grok 模式
可以在配置文件中定义自定义模式:
conffilter { grok { patterns_dir => ["/path/to/patterns"] match => { "message" => "%{CUSTOM_PATTERN:custom_field}" } } }
在 patterns 文件中定义:
shellCUSTOM_PATTERN [0-9]{3}-[A-Z]{2}
多模式匹配
Grok 支持多个匹配模式,按顺序尝试:
conffilter { grok { match => { "message" => [ "%{COMBINEDAPACHELOG}", "%{COMMONAPACHELOG}", "%{NGINXACCESS}" ] } } }
Grok 调试工具
1. Grok Debugger
使用在线 Grok Debugger 工具测试和调试模式:
- Kibana Dev Tools 中的 Grok Debugger
- Elastic 官方在线调试器
2. 添加标签便于调试
conffilter { grok { match => { "message" => "%{PATTERN:field}" } add_tag => ["_grokparsefailure"] tag_on_failure => ["_grokparsefailure"] } }
性能优化
- 使用预编译模式:Logstash 会缓存编译后的模式
- 避免贪婪匹配:使用更精确的模式提高性能
- 减少模式数量:只使用必要的模式
- 使用条件判断:对特定类型的数据应用特定的 grok 模式
最佳实践
- 从简单到复杂:先测试简单的模式,逐步增加复杂度
- 使用命名捕获组:提高代码可读性
- 处理解析失败:使用
_grokparsefailure标签处理解析失败的情况 - 文档化自定义模式:为自定义模式添加注释说明
- 版本控制:将自定义模式文件纳入版本控制