8.1、grok正则过滤器配置

8.1.1、简介

grok用于将任意的文本进行结构化处理。 grok是目前logstash中将混乱的非结构日子数据,进行结构化的最好方式。 用这个工具来解析syslog日志,apache或其他webserver日志,mysql日志的效果非常好。通常来说,只要这个日志是给人员阅读的而不是给机器处理的日志,不管什么格式Grok都适用。

Logstash定义120多种默认的模式,可以在github上找到详细的信息:

https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

当然你也可以添加属于你自己的模式。 如果你在创建模式匹配自己的日志时需要帮助,可以访问http://grokdebug.herokuapp.comhttp://grokconstructor.appspot.com/ 里的帮助信息。

8.1.2、grok基础

Grok通过文本模式来匹配你的log grok模式的语法是:%{SYNTAX:SEMANTIC} SANTAX是用于匹配目标文本的模式的名称。例如,3.44对应的模式是NUMBER;55.3.244.1对应的模式是IP。syntax用来描述如何匹配。

SEMANTIC 用来标识被匹配的文本片段,如:3.44是时间的间隔时间,可以简称为duration,进一步的,字符串55.3.244.1 或许可以用来标志正在发起请求的客户端,可以简称为client。

对于上边的例子,你的grok过滤器可以编写成这样:

%{NUMBER:duration} %{IP:client}

你可以随意的给你的grok模式增加数据转换类型。默认的所有的语义(semantics)都以字符串形式保存。如果你愿意转换semantic的数据类型,例如将字符串型转换成整型,可以通过添加标识目标数据类型的后缀来实现。例如:%{NUMBER:num:int},这里将SEMANTIC名称为num的数据从字符串类型转换为整型。目前只支持将数据转换成int或float

例如:按照syntax和semantic的概念,我们可以从这些简单的日志中,拆解出有用的字段。

55.3.244.1 GET /index.html 15824 0.043

与之对应的模式可以设置为:

%{IP:client} %{WORD:method} %{URIPATHPARM:request} %{NUMBET:byte} %{NUMBER:duration}

让我们再看一个更真实的例子:

input{
  file{
    path=>"/var/log/http.log"
  }

  filter{
    grok{
      match=>{"message" => "%{IP:client} %{WORD:,method} %{URIPATHARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
    }

  }

}

经过上面的grob 过滤器的处理,事件会增加一些额外的字段。

  • client:55.3.244.1
  • method:GET
  • request:/index.html
  • bytes: 15824
  • duration: 0.043

Regular Expressions

Grob 是在正则表达式的基础上实现的,因此所有正则表达式的语法在grok中都是有效的。正则表达式的库是Oniguruma,在Oniguruma的站点有你可看到所有正则表达式所支持的语法。

自定义模式

有时候logstash的默认模式中不能满足你的需求,那么你有以下选择: 首先,你可以使用命名的Oniguruma语法获取匹配的文本片,并将它作为一个字段进行保存:

(?<field_name>the pattern here)

例如,日志的后缀中有一个队列id的字段,是一个10位或11位的16进制的值。可以通过如下方法获取这个值:

(?<queue_id>[0-9A-F]{10,11})

或者,你可以创建自定义的模式文件。

  • 创建一个名为patterns的文件夹在其中创建一个名为extra的文件(文件的名字可以命名为其他名字,但建议这个名字对创建者是有意义的)

  • 在那个文件中,写你所需要的模式作为模式名,之后紧跟一个空格,之后是对应该模式的正则表达式。

例如,以前面描述的后缀队列id为例。

# contents of ./patterns/postfix:
POSTFIX_QUEUEID [0-9A-F]]

接下来需要在插件中通过patterns_dir参数设置,告诉Logstash自定义模式文件夹的位置。这里一个完整的例子。

Jan  1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<[email protected]>
filter{
  grok{
    patterns_dir => ["./patterns"]
    match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
  }
}

这个过滤器可以把日志拆分成以下字段:

timestamp: Jan 1 06:25:43
logsource: mailserver14
program: postfix/cleanup
pid: 21403
queue_id: BEF25A72965
syslog_message: message-id=<[email protected]>

timestamp, logsource, program, 和 pid 字段的定义来自于SYSLOGBASE 模式,它是在另一个模式中定义的。

概要——Synopsis

这个插件支持下列配置选项:

grok{

}
Setting Input type Required Default value Detail
add-field hash No {}
add_tag array No []
break_on_match boolean No true
keep_empty_captures boolean No false
match hash No {}
named_captures_only boolean No true
overwrite array No []
patterns_dir array No []
patterns_files_glob string No false
periodic_flush boolean No false
remove_field array No []
remove_tag array No []
tag_on_failure array No ["_grokparsefailure"]

results matching ""

    No results matching ""