Grok 过滤器插件
编辑Grok 过滤器插件编辑
- 插件版本: v4.4.3
- 发布日期: 2022-10-28
- 变更日志
对于其他版本,请参阅 版本化插件文档.
获取帮助编辑
如果您对插件有任何疑问,请在 Discuss 论坛中发布主题。对于错误或功能请求,请在 Github 中提交问题。有关 Elastic 支持的插件列表,请参阅 Elastic 支持矩阵.
描述编辑
解析任意文本并将其结构化。
Grok 是将非结构化日志数据解析为结构化和可查询数据的绝佳方法。
此工具非常适合 syslog 日志、apache 和其他 Web 服务器日志、mysql 日志,以及通常为人类而不是计算机编写的任何日志格式。
Logstash 默认情况下附带约 120 个模式。您可以在此处找到它们:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns。您可以轻松地添加自己的模式。(请参阅 patterns_dir
设置)
如果您需要帮助构建与您的日志匹配的模式,您会发现 http://grokdebug.herokuapp.com 和 http://grokconstructor.appspot.com/ 应用程序非常有用!
Grok 基础知识编辑
Grok 通过将文本模式组合成与您的日志匹配的内容来工作。
grok 模式的语法为 %{SYNTAX:SEMANTIC}
The SYNTAX
是将与您的文本匹配的模式的名称。例如,3.44
将与 NUMBER
模式匹配,而 55.3.244.1
将与 IP
模式匹配。语法是您匹配的方式。
The SEMANTIC
是您赋予匹配的文本片段的标识符。例如,3.44
可以是事件的持续时间,因此您可以简单地将其称为 duration
。此外,字符串 55.3.244.1
可能标识发出请求的 client
。
对于上面的示例,您的 grok 过滤器将类似于以下内容
%{NUMBER:duration} %{IP:client}
您可以选择向 grok 模式添加数据类型转换。默认情况下,所有语义都保存为字符串。如果您希望转换语义的数据类型,例如将字符串更改为整数,则在后面加上目标数据类型。例如 %{NUMBER:num:int}
,它将 num
语义从字符串转换为整数。目前唯一支持的转换是 int
和 float
。
示例:有了语法和语义的概念,我们可以从类似于此虚构的 http 请求日志的示例日志中提取有用的字段
55.3.244.1 GET /index.html 15824 0.043
此模式可以是
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
更现实的示例,让我们从文件中读取这些日志
input { file { path => "/var/log/http.log" } } filter { grok { match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } }
在 grok 过滤器之后,事件将包含一些额外的字段
-
client: 55.3.244.1
-
method: GET
-
request: /index.html
-
bytes: 15824
-
duration: 0.043
正则表达式编辑
Grok 建立在正则表达式之上,因此任何正则表达式在 grok 中都是有效的。正则表达式库是 Oniguruma,您可以在 Oniguruma 网站 上查看完整的支持的正则表达式语法。
自定义模式编辑
有时 logstash 没有您需要的模式。为此,您有几个选择。
首先,您可以使用 Oniguruma 语法进行命名捕获,这将允许您匹配一段文本并将其保存为字段
(?<field_name>the pattern here)
例如,postfix 日志有一个 queue id
,它是一个 10 或 11 个字符的十六进制值。我可以像这样轻松地捕获它
(?<queue_id>[0-9A-F]{10,11})
或者,您可以创建自定义模式文件。
- 创建一个名为
patterns
的目录,并在其中创建一个名为extra
的文件(文件名无关紧要,但请为方便自己起一个有意义的名称) - 在该文件中,将您需要的模式作为模式名称写入,后面跟着一个空格,然后是该模式的正则表达式。
例如,执行上面的 postfix queue id 示例
# contents of ./patterns/postfix: POSTFIX_QUEUEID [0-9A-F]{10,11}
然后使用此插件中的 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]>
The timestamp
, logsource
, program
, and pid
字段来自 SYSLOGBASE
模式,该模式本身由其他模式定义。
另一种选择是在过滤器中使用 pattern_definitions
内联 定义模式。这主要为了方便起见,允许用户定义一个模式,该模式仅在该过滤器中使用。在 pattern_definitions
中新定义的模式在该特定 grok
过滤器之外将不可用。
迁移到 Elastic Common Schema (ECS)编辑
为了简化迁移到 Elastic Common Schema (ECS),过滤器插件除了现有的模式之外,还提供了一组新的符合 ECS 的模式。新的 ECS 模式定义捕获符合架构的事件字段名称。
ECS 模式集包含来自传统模式集的所有模式定义,并且是传统模式集的直接替代品。使用 ecs_compatibility
设置切换模式。
ECS 兼容文件将添加新功能和增强功能。传统模式可能仍然会收到向后兼容的错误修复。
Grok 过滤器配置选项编辑
此插件支持以下配置选项,以及后面描述的 通用选项。
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
另请参阅 通用选项,了解所有过滤器插件支持的选项列表。
break_on_match
编辑
- 值类型为 布尔值
- 默认值为
true
在第一次匹配时中断。grok 的第一次成功匹配将导致过滤器完成。如果您希望 grok 尝试所有模式(也许您正在解析不同的内容),则将其设置为 false。
ecs_compatibility
编辑
- 值类型为 字符串
-
支持的值为
-
disabled
: 插件将加载传统(内置)模式定义 -
v1
,v8
: 插件提供的所有模式都将使用符合 ECS 的捕获
-
-
默认值取决于运行的 Logstash 版本
- 当 Logstash 提供
pipeline.ecs_compatibility
设置时,其值将用作默认值 - 否则,默认值为
disabled
。
- 当 Logstash 提供
控制此插件与 Elastic Common Schema (ECS) 的兼容性。此设置的值会影响匹配复合模式(例如 HTTPD_COMMONLOG
)时的提取事件字段名称。
match
编辑
- 值类型为 哈希
- 默认值为
{}
一个哈希,它定义了查找位置以及使用哪些模式的映射。
例如,以下内容将匹配 message
字段中现有值的给定模式,如果找到匹配项,则将使用捕获的值将字段 duration
添加到事件中
filter { grok { match => { "message" => "Duration: %{NUMBER:duration}" } } }
如果需要对单个字段匹配多个模式,则该值可以是模式数组。
filter { grok { match => { "message" => [ "Duration: %{NUMBER:duration}", "Speed: %{NUMBER:speed}" ] } } }
要对多个字段执行匹配,只需在 match
哈希中使用多个条目。
filter { grok { match => { "speed" => "Speed: %{NUMBER:speed}" "duration" => "Duration: %{NUMBER:duration}" } } }
但是,如果一个模式依赖于先前模式创建的字段,请将它们分成两个单独的 grok 过滤器。
filter { grok { match => { "message" => "Hi, the rest of the message is: %{GREEDYDATA:rest}" } } grok { match => { "rest" => "a number %{NUMBER:number}, and a word %{WORD:word}" } } }
overwrite
edit
- 值类型为 数组
- 默认值为
[]
要覆盖的字段。
这允许您覆盖已存在字段中的值。
例如,如果您在 message
字段中有一个 syslog 行,您可以使用以下方式用匹配的一部分覆盖 message
字段。
filter { grok { match => { "message" => "%{SYSLOGBASE} %{DATA:message}" } overwrite => [ "message" ] } }
在这种情况下,类似于 May 29 16:37:11 sadness logger: hello world
的行将被解析,并且 hello world
将覆盖原始消息。
如果在 overwrite
中使用字段引用,则必须在模式中使用字段引用。示例
filter { grok { match => { "somefield" => "%{NUMBER} %{GREEDYDATA:[nested][field][test]}" } overwrite => [ "[nested][field][test]" ] } }
pattern_definitions
edit
- 值类型为 哈希
- 默认值为
{}
一个模式名称和模式元组的哈希,定义当前过滤器要使用的自定义模式。匹配现有名称的模式将覆盖预先存在的定义。可以将其视为仅供此 grok 定义使用的内联模式。
patterns_dir
edit
- 值类型为 数组
- 默认值为
[]
Logstash 默认情况下附带了许多模式,因此您不必自己定义它,除非您要添加其他模式。您可以使用此设置指向多个模式目录。请注意,Grok 将读取目录中与 patterns_files_glob 匹配的所有文件,并假定它是一个模式文件(包括任何波浪号备份文件)。
patterns_dir => ["/opt/logstash/patterns", "/opt/logstash/extra_patterns"]
模式文件是纯文本,格式为
NAME PATTERN
例如
NUMBER \d+
模式在创建管道时加载。
通用选项edit
以下配置选项受所有过滤器插件支持。
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
add_field
edit
- 值类型为 哈希
- 默认值为
{}
如果此过滤器成功,则将任何任意字段添加到此事件。字段名称可以是动态的,并使用 %{field}
包含事件的一部分。
示例
filter { grok { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" } } }
# You can also add multiple fields at once: filter { grok { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" "new_field" => "new_static_value" } } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器在成功时将添加字段 foo_hello
(如果存在),其值为上述值,并且 %{host}
部分将替换为事件中的该值。第二个示例还将添加一个硬编码字段。
add_tag
edit
- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则将任意标签添加到事件。标签可以是动态的,并使用 %{field}
语法包含事件的一部分。
示例
filter { grok { add_tag => [ "foo_%{somefield}" ] } }
# You can also add multiple tags at once: filter { grok { add_tag => [ "foo_%{somefield}", "taggedy_tag"] } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器在成功时将添加标签 foo_hello
(当然,第二个示例将添加一个 taggedy_tag
标签)。
id
edit
- 值类型为 字符串
- 此设置没有默认值。
在插件配置中添加一个唯一的 ID
。如果未指定 ID,Logstash 将生成一个 ID。强烈建议您在配置中设置此 ID。当您有两个或多个相同类型的插件时,这尤其有用,例如,如果您有两个 grok 过滤器。在这种情况下,添加一个命名 ID 将有助于在使用监控 API 时监控 Logstash。
filter { grok { id => "ABC" } }
id
字段中的变量替换仅支持环境变量,不支持使用来自密钥存储的值。
remove_field
edit
- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则从此事件中删除任意字段。字段名称可以是动态的,并使用 %{field} 示例包含事件的一部分。
filter { grok { remove_field => [ "foo_%{somefield}" ] } }
# You can also remove multiple fields at once: filter { grok { remove_field => [ "foo_%{somefield}", "my_extraneous_field" ] } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器在成功时将删除名为 foo_hello
的字段(如果存在)。第二个示例将删除一个额外的非动态字段。
remove_tag
edit
- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则从事件中删除任意标签。标签可以是动态的,并使用 %{field}
语法包含事件的一部分。
示例
filter { grok { remove_tag => [ "foo_%{somefield}" ] } }
# You can also remove multiple tags at once: filter { grok { remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"] } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器在成功时将删除标签 foo_hello
(如果存在)。第二个示例还将删除一个令人悲伤的、不需要的标签。