Dissect 过滤器插件
编辑Dissect 过滤器插件
编辑- 插件版本: v1.2.5
- 发布日期: 2022-02-14
- 变更日志
对于其他版本,请参见 版本化插件文档。
获取帮助
编辑有关插件的问题,请在 Discuss 论坛中发起主题。对于错误或功能请求,请在 Github 中提交问题。有关 Elastic 支持的插件列表,请参阅 Elastic 支持矩阵。
描述
编辑Dissect 过滤器插件使用定义的模式对传入的字符串进行标记化。它使用分隔符将非结构化事件数据提取到字段中。此过程称为标记化。
与常规拆分操作(其中一个分隔符应用于整个字符串)不同,Dissect 操作将一组分隔符应用于字符串值。
所有键都必须找到并提取才能成功进行标记化。如果找不到一个或多个键,则会发生错误,并且不会修改原始事件。
Dissect 或 Grok?或两者兼而有之?
编辑Dissect 与 Grok 的区别在于它不使用正则表达式,并且速度更快。当数据可靠地重复时,Dissect 效果很好。当文本结构在行与行之间发生变化时,Grok 是更好的选择。
当行的某一部分可靠地重复,但整行不重复时,您可以将 Dissect 和 Grok 用于混合用例。Dissect 过滤器可以分解重复的行部分。Grok 过滤器可以使用更多正则表达式可预测性来处理其余字段值。
术语
编辑分解模式 - 描述文本格式的字段和分隔符集。也称为分解。分解使用一组 %{}
部分来描述:%{a} - %{b} - %{c}
字段 - 从 %{
到 }
(包括)的文本。
分隔符 - }
和下一个 %{
字符之间的文本。除 %{
、'not }'
或 }
之外的任何字符集都是分隔符。
键 - %{
和 }
之间的文本,不包括 ?
、+
、&
前缀和序数后缀。
示例
%{?aaa}
- 键是 aaa
%{+bbb/3}
- 键是 bbb
%{&ccc}
- 键是 ccc
使用 .
(点)作为 key
将生成字段名称中包含 .
的字段。如果要获取嵌套字段,请使用括号表示法,例如 %{[fieldname][subfieldname]}
。
示例配置
编辑配置可能如下所示
filter { dissect { mapping => { "message" => "%{ts} %{+ts} %{+ts} %{src} %{} %{prog}[%{pid}]: %{msg}" } } }
当从左到右分解字符串时,会捕获到第一个分隔符之前的文本。捕获的文本存储在第一个字段中。对于每个字段/分隔符对重复此操作,直到到达最后一个分隔符。然后 其余文本存储在最后一个字段中。
符号
编辑注意事项和使用指南
编辑- 对于追加或间接字段,键可以引用在分解之前事件中已存在的字段。
-
如果不想存储间接键/值,请使用跳过字段。
示例
%{?a}: %{&a}
应用于文本google: 77.98
将构建键/值google => 77.98
。 -
追加和间接不能组合使用。
示例
%{+&something}
将向&something
键添加值(可能不是预期的结果)。%{&+something}
将向+something
键添加值(同样可能不是预期的)。
追加字段符号
编辑如果该值是第一个看到的字段,则将其存储。后续字段将附加到另一个值。
键以 +
为前缀。最终值使用键存储在事件中。
在字段之前找到的分隔符将附加到值。如果在字段之前找不到分隔符,则使用单个空格字符。
示例
%{+some_field}
是一个追加字段。
%{+some_field/2}
是一个带有顺序修饰符的追加字段。
顺序修饰符
顺序修饰符 /digits
允许重新排序追加序列。
示例
对于文本 1 2 3 go
,此 %{+a/2} %{+a/1} %{+a/4} %{+a/3}
将构建键/值 a => 2 1 go 3
。
追加字段 没有顺序修饰符将在声明的顺序中追加。
示例
对于文本 1 2 3 go
,此 %{a} %{b} %{+a}
将构建两个键/值 a => 1 3 go, b => 2
间接字段符号
编辑找到的值使用另一个字段的找到值作为键添加到事件中。键以 &
为前缀。
示例
%{&some_field}
是一个间接字段,其中键间接来自 some_field
的值。
对于文本 error: some_error, some_description
,此符号 error: %{?err}, %{&err}
将构建键/值 some_error => some_description
。
多个连续分隔符处理
编辑从该插件的 1.1.1 版开始,多个找到的分隔符处理已更改。现在,默认情况下,多个连续的分隔符被视为缺失的字段,而不是填充。如果您已经在使用 Dissect 并且您的源文本使用额外分隔符填充了字段,则需要更改您的配置。请阅读下面的部分。
分隔符之间的空数据
编辑给定此文本作为用于创建分解的示例
John Smith,Big Oaks,Wood Lane,Hambledown,Canterbury,CB34RY
创建的分解(包含 6 个字段)为
%{name},%{addr1},%{addr2},%{addr3},%{city},%{zip}
当处理这样的行时
Jane Doe,4321 Fifth Avenue,,,New York,87432
Dissect 将创建具有 addr2 和 addr3
的空字段的事件,如下所示
{ "name": "Jane Doe", "addr1": "4321 Fifth Avenue", "addr2": "", "addr3": "", "city": "New York" "zip": "87432" }
用作填充以视觉对齐字段的分隔符
编辑向右侧填充
给定这些文本作为用于创建分解的样本
00000043 ViewReceive machine-321 f3000a3b Calc machine-123
分解(包含 3 个字段)为
%{id} %{function->} %{server}
请注意,在上面,第二个字段有一个 ->
后缀,它告诉 Dissect 忽略其右侧的填充。
Dissect 将创建这些事件
{ "id": "00000043", "function": "ViewReceive", "server": "machine-123" } { "id": "f3000a3b", "function": "Calc", "server": "machine-321" }
始终将 ->
后缀添加到填充左侧的字段。
向左侧填充(从人的角度来看)
给定这些文本作为用于创建分解的样本
00000043 ViewReceive machine-321 f3000a3b Calc machine-123
分解(包含 3 个字段)现在为
%{id->} %{function} %{server}
这里 ->
后缀移动到 id
字段,因为 Dissect 将填充视为位于 id
字段的右侧。
条件处理
编辑您可能希望在 if
块内使用此过滤器。这确保事件包含一个具有适合分解的结构的字段值。
示例
filter { if [type] == "syslog" or "syslog" in [tags] { dissect { mapping => { "message" => "%{ts} %{+ts} %{+ts} %{src} %{} %{prog}[%{pid}]: %{msg}" } } } }
Dissect 过滤器配置选项
编辑此插件支持以下配置选项以及稍后描述的 常见选项。
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
另请参见 常见选项,了解所有过滤器插件支持的选项列表。
convert_datatype
编辑- 值类型为 哈希
- 默认值为
{}
使用此设置,可以指定 int
和 float
数据类型转换。这些将在所有 mapping
解剖完成后进行。请随意单独使用此设置,而无需 mapping
部分。
示例
filter { dissect { convert_datatype => { "cpu" => "float" "code" => "int" } } }
mapping
编辑- 值类型为 哈希
- 默认值为
{}
field => value
的分解哈希
不要在值中使用转义的新行 \n
。它将被解释为两个字符 \
+ n
。而是使用配置中的实际换行符。如果值包含双引号,请使用单引号定义值。
可以在先前分解的值上执行后续分解,或者它们可以是独立的。
示例
filter { dissect { mapping => { # using an actual line break "message" => '"%{field1}" "%{field2}" "%{description}"' "description" => "%{field3} %{field4} %{field5}" } } }
如果您想保留字段 description
但还想进一步分解它,这很有用。
常见选项
编辑所有过滤器插件都支持这些配置选项
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
add_field
编辑- 值类型为 哈希
- 默认值为
{}
如果此过滤器成功,则向此事件添加任何任意字段。字段名称可以是动态的,并包含使用 %{field}
的事件的一部分。
示例
filter { dissect { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" } } }
# You can also add multiple fields at once: filter { dissect { add_field => { "foo_%{somefield}" => "Hello world, from %{host}" "new_field" => "new_static_value" } } }
如果事件具有字段 "somefield" == "hello"
,则此过滤器在成功后将添加字段 foo_hello
(如果存在),其值为上述值,并且 %{host}
部分替换为事件中的该值。第二个示例还将添加一个硬编码字段。
add_tag
编辑- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则向事件添加任意标签。标签可以是动态的,并使用%{field}
语法包含事件的部分内容。
示例
filter { dissect { add_tag => [ "foo_%{somefield}" ] } }
# You can also add multiple tags at once: filter { dissect { add_tag => [ "foo_%{somefield}", "taggedy_tag"] } }
如果事件具有字段"somefield" == "hello"
,则此过滤器成功后,将添加标签foo_hello
(第二个示例当然会添加taggedy_tag
标签)。
id
编辑- 值类型为字符串
- 此设置没有默认值。
向插件配置添加唯一的ID
。如果未指定ID,Logstash将生成一个。强烈建议在配置中设置此ID。当您有两个或多个相同类型的插件时,这尤其有用,例如,如果您有两个dissect过滤器。在这种情况下,添加命名ID将有助于在使用监控API时监控Logstash。
filter { dissect { id => "ABC" } }
id
字段中的变量替换仅支持环境变量,不支持使用密钥存储中的值。
remove_field
编辑- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则从此事件中删除任意字段。字段名称可以是动态的,并使用 %{field} 示例包含事件的部分内容
filter { dissect { remove_field => [ "foo_%{somefield}" ] } }
# You can also remove multiple fields at once: filter { dissect { remove_field => [ "foo_%{somefield}", "my_extraneous_field" ] } }
如果事件具有字段"somefield" == "hello"
,则此过滤器成功后,将删除名称为foo_hello
的字段(如果存在)。第二个示例将删除一个额外的、非动态的字段。
remove_tag
编辑- 值类型为 数组
- 默认值为
[]
如果此过滤器成功,则从事件中删除任意标签。标签可以是动态的,并使用%{field}
语法包含事件的部分内容。
示例
filter { dissect { remove_tag => [ "foo_%{somefield}" ] } }
# You can also remove multiple tags at once: filter { dissect { remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"] } }
如果事件具有字段"somefield" == "hello"
,则此过滤器成功后,将删除标签foo_hello
(如果存在)。第二个示例也将删除一个令人不快的、不需要的标签。