我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第5篇文章,点击查看活动详情
grok 用于对长文本进行切割,提取关键信息,语法为:
%{SYNTAX:SEMANTIC}
- SYNTAX:代表匹配值的类型,例如NUMBER能匹配3.14,IP能匹配127.0.0.1
- SEMANTIC:代表存储该值的变量名
例如下面的语法表示匹配 NUMBER 类型的数据,存到 duration 变量中,匹配 IP 类型的数据,存到 ip 变量中。
%{NUMBER:duration} %{IP:ip}
默认情况下,所有语义都保存为字符串,也可以转变数据类型,目前支持的转换只有 int 和 float 两种类型,例如将 duration 从一个字符串转换为一个整数。
%{NUMBER:duration:int}
举个例子:假如有下面的日志:
55.3.244.1 GET /index.html 15824 0.043
可以用下面模式提取内容:
%{IP:ip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
logstash 匹配:
filter {
grok {
match => { "message" => "%{IP:ip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
得到的结果为:
● ip: 55.3.244.1
● method: GET
● request: /index.html
● bytes: 15824
● duration: 0.043
所以 grok 其实就是正则表达式,有一些内置好的正则可以拿过来直接用,但没办法提供你所需要的匹配类型,此时可以自定义正则,语法是:
(?<field_name>the pattern here)
例如:
(?<no>QQ[0-9]{1,5})
匹配所有以 QQ 开头的,后面有1-5位数字的工号。还可以把这个正则表达式进行封装,先建一个 patterns 的文件夹,在里面建一个文件,把刚才的内容填进去即可:
NO QQ[0-9]{1,5}
然后用:
filter {
grok {
patterns_dir => ["./patterns"]
match => { "message" => "%{WORD:name} %{NUMBER:age}: %{NO:no}" }
}
}
过滤配置项:
-
break_on_match
布尔值,默认是true
描述:match可以一次设定多组,预设会依照顺序设定处理,如果日志满足设定条件,则会终止向下处理。但有的时候我们会希望让Logstash跑完所有的设定,这时可以将break_on_match设为false。
-
keep_empty_captures
布尔值,默认值是 false 描述:如果为true,捕获失败的字段将设置为空值
-
match
对象,默认值是 {} 描述:字段⇒值匹配
filter { grok { match => { "message" => "Duration: %{NUMBER:duration}" } } } # 如果你需要针对单个字段匹配多个模式,则该值可以是一组,例如: filter { grok { match => { "message" => [ "Duration: %{NUMBER:duration}", "Speed: %{NUMBER:speed}" ] } } } -
named_captures_only
布尔值,默认值是 true 描述:如果为真,只存 grok 正则表达式储命名捕获的结果
-
overwrite
数组,默认是[] 描述:覆盖字段内容
filter { grok { match => { "message" => "%{SYSLOGBASE} %{DATA:message}" } overwrite => [ "message" ] } } -
pattern_definitions
值类型是 数组,默认值是 {} 描述:模式名称和模式正则表达式,也是用于定义当前过滤器要使用的自定义模式。匹配现有名称的模式将覆盖预先存在的定义。可以将此视为仅适用于grok定义的内联模式,patterns_dir是将模式写在外部。
filter { grok { pattern_definitions => {"MYSELFTIMESTAMP" => "20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})"} match => {"message" => ["%{MYSELFTIMESTAMP:timestamp}"]} } } -
patterns_dir
值类型是数组,默认值是 [] 描述:一些复杂的正则表达式,不适合直接写到filter中,可以指定一个文件夹,用来专门保存正则表达式的文件,需要注意的是该文件夹中的所有文件中的正则表达式都会被依次加载,包括备份文件。
patterns_dir => ["/opt/logstash/patterns", "/opt/logstash/extra_patterns"]1正则文件以文本格式描述:
NAME PATTERN例如:这是一个数字的表达式
NUMBER \d+1 -
patterns_file_glob
字符串, 默认值:
*描述:针对patterns_dir属性中指定的文件夹里哪些正则文件,可以在这个filter中生效,需要本属性来指定。默认值*是指所有正则文件都生效。 -
tag_on_failure
值类型是数组,默认值是 _grokparsefailure 描述:没有成功匹配时,将值附加到字段
-
tag_on_timeout
值类型是字符串,默认值是 _groktimeout 描述:如果Grok正则表达式超时,则应用标记。
-
timeout_millis
值类型是数字,默认值是 30000 描述: 尝试在这段时间后终止正则表达式。如果应用了多个模式,则这适用于每个模式。这将永远不会提前超时,但超时可能需要一些时间。实际的超时时间是基于250ms量化的近似值。设置为0以禁用超时。
常用选项
所有过滤器插件都支持以下配置选项:
-
add_field
对象,默认值是 {} 描述:在匹配日志中增加一个 field,可以通过%{field}动态命名field名或field的值。例如:
filter { grok { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" } } } # 你也可以一次添加多个字段 filter { grok { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" "new_field" => "new_static_value" } } } -
add_tag
数组,默认值是 [] 描述:如果此过滤器成功,请向该事件添加任意标签。标签可以是动态的,并使用%{field} 语法包含事件的一部分。
filter { grok { add_tag => [ "foo_%{somefield}" ] } } # 你也可以一次添加多个标签 filter { grok { add_tag => [ "foo_%{somefield}", "taggedy_tag"] } } -
enable_metric
值类型是布尔值,默认值是 true 描述:禁用或启用度量标准
-
id
值类型是字符串,此设置没有默认值。 描述:向插件实例添加唯一ID,此ID用于跟踪插件特定配置的信息。 例如:
filter { grok { id => "ABC" } } -
periodic_flush
值类型是布尔值,默认值是 false 描述:如果设置为ture,会定时的调用filter的更新函数(flush method)
-
remove_field
值的类型:array,默认值:[] 描述:删除当前文档中的指定filted
filter { grok { remove_field => [ "foo_%{somefield}" ] } } # 你也可以一次移除多个字段: filter { grok { remove_field => [ "foo_%{somefield}", "my_extraneous_field" ] } } -
remove_tag
值类型是数组,默认值是 [] 描述:如果此过滤器成功,请从该事件中移除任意标签。标签可以是动态的,并使用%{field} 语法包括事件的一部分。
filter { grok { remove_tag => [ "foo_%{somefield}" ] } } # 你也可以一次删除多个标签 filter { grok { remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"] } }