Dissect 过滤器插件
编辑Dissect 过滤器插件编辑
- 插件版本: v1.2.5
- 发布日期: 2022-02-14
- 变更日志
有关其他版本,请参阅 版本化插件文档。
获取帮助编辑
有关插件的问题,请在 Discuss 论坛中发布主题。对于错误或功能请求,请在 Github 中创建问题。有关 Elastic 支持的插件列表,请参阅 Elastic 支持矩阵。
描述编辑
Dissect 过滤器插件使用定义的模式对传入的字符串进行标记化。它使用分隔符将非结构化事件数据提取到字段中。此过程称为标记化。
与将一个分隔符应用于整个字符串的常规拆分操作不同,Dissect 操作将一组分隔符应用于字符串值。
所有键都必须找到并提取才能成功进行标记化。如果一个或多个键找不到,则会发生错误,并且原始事件不会被修改。
Dissect 或 Grok?或者两者?编辑
Dissect 与 Grok 的区别在于它不使用正则表达式,并且速度更快。当数据可靠地重复时,Dissect 非常有效。当文本结构在行与行之间变化时,Grok 是更好的选择。
当行的某一部分可靠地重复,但整行不重复时,您可以将 Dissect 和 Grok 用于混合用例。Dissect 过滤器可以分解重复的行的部分。Grok 过滤器可以使用更多正则表达式可预测性来处理剩余的字段值。
术语编辑
dissect 模式 - 描述文本格式的字段和分隔符集。也称为解剖。解剖使用一组 %{}
部分来描述:%{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
(如果存在)。第二个示例还将删除一个令人沮丧的、不需要的标签。