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}

跳过字段符号

编辑

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

示例

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

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

哈希

映射

哈希

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。当您有两个或多个相同类型的插件时,这尤其有用,例如,如果您有两个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(如果存在)。第二个示例也将删除一个令人不快的、不需要的标签。