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

hash

mapping

hash

tag_on_failure

array

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

 

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。如果未指定 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(如果存在)。第二个示例还将删除一个令人沮丧的、不需要的标签。