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}

跳过字段符号

编辑

找到的值在内部存储,但不会添加到事件中。如果提供了键,则该键以 ? 为前缀。

示例

%{} 是一个空的跳过字段。

%{?foo} 是一个命名的跳过字段。

追加字段符号

编辑

如果该值是看到的第一个字段,则会存储它。后续字段将附加到另一个值。

该键以 + 为前缀。最终值将使用该键存储在事件中。

在该字段之前找到的分隔符将与该值附加在一起。如果在该字段之前没有找到分隔符,则使用单个空格字符。

示例

%{+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

哈希

mapping

哈希

tag_on_failure

数组

另请参阅通用选项,以获取所有过滤器插件支持的选项列表。

 

convert_datatype

编辑
  • 值类型是 哈希
  • 默认值为 {}

使用此设置,可以指定 intfloat 数据类型转换。这些将在所有 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 但也对其进行进一步解剖,这将非常有用。

tag_on_failure

编辑
  • 值类型是 数组
  • 默认值为 ["_dissectfailure"]

当解剖失败时,将值附加到 tags 字段

通用选项

编辑

所有过滤器插件都支持这些配置选项

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 标签)。

enable_metric

编辑

禁用或启用此特定插件实例的指标日志记录。默认情况下,我们会记录所有可以记录的指标,但您可以禁用特定插件的指标收集。

  • 值类型为 字符串
  • 此设置没有默认值。

向插件配置添加唯一的 ID。如果未指定 ID,Logstash 将生成一个。强烈建议在配置中设置此 ID。当您有两个或多个相同类型的插件时,例如,如果您有 2 个 dissect 过滤器,这将特别有用。在这种情况下添加命名 ID 将有助于在使用监控 API 时监控 Logstash。

    filter {
      dissect {
        id => "ABC"
      }
    }

id 字段中的变量替换仅支持环境变量,不支持使用来自密钥存储的值。

periodic_flush

编辑

定期调用过滤器刷新方法。可选。

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 (如果存在)。第二个示例也会删除一个令人伤心、不想要的标签。