乐闻世界logo
搜索文章和话题

Logstash 中 Grok 过滤器的作用是什么,如何使用 Grok 解析日志?

2月21日 16:02

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 访问日志解析

conf
filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } }

解析后会生成以下字段:

  • clientip
  • ident
  • auth
  • timestamp
  • verb
  • request
  • httpversion
  • response
  • bytes
  • referrer
  • agent

2. 自定义日志格式

假设日志格式为:

shell
2024-02-21 10:30:45 [INFO] User john.doe logged in from 192.168.1.100

配置如下:

conf
filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:level}\] %{GREEDYDATA:message}" } } }

3. 复杂日志解析

conf
filter { 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 模式

可以在配置文件中定义自定义模式:

conf
filter { grok { patterns_dir => ["/path/to/patterns"] match => { "message" => "%{CUSTOM_PATTERN:custom_field}" } } }

在 patterns 文件中定义:

shell
CUSTOM_PATTERN [0-9]{3}-[A-Z]{2}

多模式匹配

Grok 支持多个匹配模式,按顺序尝试:

conf
filter { grok { match => { "message" => [ "%{COMBINEDAPACHELOG}", "%{COMMONAPACHELOG}", "%{NGINXACCESS}" ] } } }

Grok 调试工具

1. Grok Debugger

使用在线 Grok Debugger 工具测试和调试模式:

  • Kibana Dev Tools 中的 Grok Debugger
  • Elastic 官方在线调试器

2. 添加标签便于调试

conf
filter { grok { match => { "message" => "%{PATTERN:field}" } add_tag => ["_grokparsefailure"] tag_on_failure => ["_grokparsefailure"] } }

性能优化

  1. 使用预编译模式:Logstash 会缓存编译后的模式
  2. 避免贪婪匹配:使用更精确的模式提高性能
  3. 减少模式数量:只使用必要的模式
  4. 使用条件判断:对特定类型的数据应用特定的 grok 模式

最佳实践

  1. 从简单到复杂:先测试简单的模式,逐步增加复杂度
  2. 使用命名捕获组:提高代码可读性
  3. 处理解析失败:使用 _grokparsefailure 标签处理解析失败的情况
  4. 文档化自定义模式:为自定义模式添加注释说明
  5. 版本控制:将自定义模式文件纳入版本控制
标签:Logstash