Kv 过滤器插件

编辑

有关其他版本,请参阅版本化插件文档

获取帮助

编辑

有关插件的问题,请在Discuss论坛中打开一个主题。有关错误或功能请求,请在Github中打开一个问题。有关 Elastic 支持的插件列表,请查阅Elastic 支持矩阵

描述

编辑

此过滤器有助于自动解析 foo=bar 类型的消息(或特定事件字段)。

例如,如果您的日志消息包含 ip=1.2.3.4 error=REFUSED,您可以通过配置自动解析这些消息

    filter {
      kv { }
    }

以上配置将导致 ip=1.2.3.4 error=REFUSED 消息具有以下字段

  • ip: 1.2.3.4
  • error: REFUSED

这对于 postfix、iptables 和其他倾向于 key=value 语法的日志类型非常有用。

您可以配置任何任意字符串来分割数据,以防您的数据未使用 = 符号和空格进行结构化。例如,此过滤器还可以用于解析查询参数,如 foo=bar&baz=fizz,方法是将 field_split 参数设置为 &

事件元数据和 Elastic Common Schema (ECS)

编辑

无论 ECS 兼容性如何,该插件的行为都相同,只是在启用 ECS 且未设置 target 时发出警告。

设置 target 选项以避免潜在的模式冲突。

Kv 过滤器配置选项

编辑

此插件支持以下配置选项以及稍后描述的通用选项

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

 

allow_duplicate_values

编辑

用于删除重复键/值对的布尔选项。设置为 false 时,只会保留一个唯一的键/值对。

例如,考虑一个像 from=me from=me 这样的源。[from] 将映射到包含两个元素的数组:["me", "me"]。要仅保留唯一的键/值对,您可以使用以下配置

    filter {
      kv {
        allow_duplicate_values => false
      }
    }

allow_empty_values

编辑

用于显式包含空值的布尔选项。设置为 true 时,空值将添加到事件中。

解析空值通常需要 whitespace => strict

default_keys

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

一个哈希,指定在要解析的源字段中不存在这些键的情况下应添加到事件中的默认键及其值。

    filter {
      kv {
        default_keys => [ "from", "[email protected]",
                         "to", "[email protected]" ]
      }
    }

ecs_compatibility

编辑
  • 值类型为 字符串
  • 支持的值为

    • disabled:不使用 ECS 兼容的字段名称
    • v1:Elastic Common Schema 兼容行为(未设置 target 时发出警告)

控制此插件与Elastic Common Schema (ECS)的兼容性。有关详细信息,请参阅事件元数据和 Elastic Common Schema (ECS)

exclude_keys

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

一个数组,指定不应添加到事件中的已解析键。默认情况下,不会排除任何键。

例如,考虑一个像 Hey, from=<abc>, to=def foo=bar 这样的源。要排除 fromto,但保留 foo 键,您可以使用以下配置

    filter {
      kv {
        exclude_keys => [ "from", "to" ]
      }
    }

field_split

编辑

一个字符串,用于作为单字符字段分隔符来解析出键值对。

这些字符形成一个正则表达式字符类,因此您必须使用 \ 转义特殊的正则表达式字符,如 []

URL 查询字符串示例

例如,要从 URL 查询字符串(如 ?pin=12345~0&d=123&[email protected]&oq=bobo&ss=12345)中拆分参数

    filter {
      kv {
        field_split => "&?"
      }
    }

以上操作将使用 &? 字符进行拆分,从而生成以下字段

field_split_pattern

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

一个正则表达式,用作字段分隔符以解析出键值对。可用于定义多字符字段分隔符。设置 field_split_pattern 选项将优先于 field_split 选项。

请注意,您应避免在正则表达式中使用捕获组,并且应谨慎使用前瞻或后顾以及位置锚点。

例如,要在重复出现一个或多个冒号上拆分字段 k1=v1:k2=v2::k3=v3:::k4=v4

    filter { kv { field_split_pattern => ":+" } }

要在需要转义的正则表达式字符(如加号)上拆分字段 k1=v1++k2=v2++k3=v3++k4=v4

    filter { kv { field_split_pattern => "\\+\\+" } }

include_brackets

编辑

一个布尔值,指定是否将方括号、尖括号和圆括号视为应从值中删除的值“包装器”。

    filter {
      kv {
        include_brackets => true
      }
    }

例如,以下行的结果:bracketsone=(hello world) bracketstwo=[hello world] bracketsthree=<hello world>

将是

  • bracketsone: hello world
  • bracketstwo: hello world
  • bracketsthree: hello world

而不是

  • bracketsone: (hello
  • bracketstwo: [hello
  • bracketsthree: <hello

include_keys

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

一个数组,指定应添加到事件中的已解析键。默认情况下,将添加所有键。

例如,考虑一个像 Hey, from=<abc>, to=def foo=bar 这样的源。要包括 fromto,但排除 foo 键,您可以使用以下配置

    filter {
      kv {
        include_keys => [ "from", "to" ]
      }
    }

prefix

编辑

一个字符串,用于添加到所有提取的键的前面。

例如,要将 arg_ 添加到所有键的前面

    filter { kv { prefix => "arg_" } }

recursive

编辑

一个布尔值,指定是否向下钻取到值并从中递归获取更多键值对。额外的键值对将存储为根键的子键。

默认情况下不递归值。

    filter {
      kv {
        recursive => "true"
      }
    }

remove_char_key

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

一个字符串,用于删除键中的字符。

这些字符形成一个正则表达式字符类,因此您必须使用 \ 转义特殊的正则表达式字符,如 []

与 trim 选项相反,无论字符的位置如何,都会从键中删除所有字符。

例如,要从键中删除 < > [ ], 字符

    filter {
      kv {
        remove_char_key => "<>\[\],"
      }
    }

remove_char_value

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

一个字符串,用于删除值中的字符。

这些字符形成一个正则表达式字符类,因此您必须使用 \ 转义特殊的正则表达式字符,如 []

与 trim 选项相反,无论字符的位置如何,都会从值中删除所有字符。

例如,要从值中删除 <>[], 字符

    filter {
      kv {
        remove_char_value => "<>\[\],"
      }
    }

source

编辑
  • 值类型为 字符串
  • 默认值为 "message"

要对其执行 key=value 搜索的字段

例如,要处理 not_the_message 字段

    filter { kv { source => "not_the_message" } }

target

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

用于存放所有键值对的容器的名称。

如果省略此设置,则字段将作为单独的字段写入事件的根目录。

例如,要将所有键放入事件字段 kv 中

    filter { kv { target => "kv" } }

tag_on_failure

编辑
  • 值类型为 数组
  • 此设置的默认值为 [_kv_filter_error]。

当 kv 操作导致在插件内抛出运行时异常时,该操作会安全中止,而不会导致插件崩溃,并且该事件会使用提供的值进行标记。

tag_on_timeout

编辑
  • 值类型为 字符串
  • 此设置的默认值为 _kv_filter_timeout

启用超时并且 kv 操作中止时,该事件会使用提供的值进行标记(请参阅:timeout_millis)。

timeout_millis

编辑
  • 值类型为 数字
  • 此设置的默认值为 30000(30 秒)。
  • 设置为零 (0) 可禁用超时

超时提供了一种保护措施,以防止输入对于用于提取键/值对的正则表达式而言是病态的。当解析事件超出此阈值时,该操作会中止,并且该事件会被标记,以防止该操作阻止管道(请参阅:tag_on_timeout)。

transform_key

编辑
  • 值可以是:lowercaseuppercasecapitalize 中的任意一个
  • 此设置没有默认值。

将键转换为小写、大写或首字母大写。

例如,要将所有键转换为小写

    filter {
      kv {
        transform_key => "lowercase"
      }
    }

transform_value

编辑
  • 值可以是:lowercaseuppercasecapitalize 中的任意一个
  • 此设置没有默认值。

将值转换为小写、大写或首字母大写。

例如,要将所有值转换为首字母大写

    filter {
      kv {
        transform_value => "capitalize"
      }
    }

trim_key

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

一个用于从键中修剪字符的字符串。当你的键被括号包裹或以空格开头时,这很有用。

这些字符形成一个正则表达式字符类,因此您必须使用 \ 转义特殊的正则表达式字符,如 []

只从键的开头和结尾修剪字符。

例如,要从键中修剪 <>[], 字符

    filter {
      kv {
        trim_key => "<>\[\],"
      }
    }

trim_value

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

用于转换检查的常量。一个用于从值中修剪字符的字符串。当你的值被括号包裹或以逗号结尾时(如 postfix 日志),这很有用。

这些字符形成一个正则表达式字符类,因此您必须使用 \ 转义特殊的正则表达式字符,如 []

只从值的开头和结尾修剪字符。

例如,要从值中修剪 <>[], 字符

    filter {
      kv {
        trim_value => "<>\[\],"
      }
    }

value_split

编辑

一个非空的字符串,用作解析键值对的单字符值分隔符。

这些字符形成一个正则表达式字符类,因此您必须使用 \ 转义特殊的正则表达式字符,如 []

例如,要识别诸如 key1:value1 key2:value2 这样的键值

    filter { kv { value_split => ":" } }

value_split_pattern

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

一个正则表达式,用作解析键值对的值分隔符。用于定义多字符值分隔符非常有用。设置 value_split_pattern 选项将优先于 value_split 选项。

请注意,您应避免在正则表达式中使用捕获组,并且应谨慎使用前瞻或后顾以及位置锚点。

有关示例,请参阅 field_split_pattern

whitespace

编辑
  • 值可以是:lenient, strict
  • 默认值是 lenient

一个选项,用于指定在接受配置的值分隔符序列周围的不必要空格时是宽容还是严格

默认情况下,该插件在 lenient 模式下运行,该模式会忽略在值分隔符之前或之后出现的空格。虽然这允许插件对大多数输入进行合理的猜测,但在某些情况下,它可能过于宽容。

如果你可以控制输入数据并保证在用于拆分值的模式周围没有添加额外的空格,则你可能需要启用 whitespace => strict 模式。这样做将确保紧跟在值分隔符之后的字段分隔符序列被解释为空字段。

通用选项

编辑

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

add_field

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

如果此过滤器成功,则向此事件添加任何任意字段。字段名称可以是动态的,并使用 %{field} 包含事件的部分内容。

例子

    filter {
      kv {
        add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
      }
    }
    # You can also add multiple fields at once:
    filter {
      kv {
        add_field => {
          "foo_%{somefield}" => "Hello world, from %{host}"
          "new_field" => "new_static_value"
        }
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时,如果存在,将添加字段 foo_hello,其值为上面所示,并且 %{host} 部分将替换为事件中的该值。第二个示例还将添加一个硬编码字段。

add_tag

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

如果此过滤器成功,则向事件添加任意标签。标签可以是动态的,并使用 %{field} 语法包含事件的部分内容。

例子

    filter {
      kv {
        add_tag => [ "foo_%{somefield}" ]
      }
    }
    # You can also add multiple tags at once:
    filter {
      kv {
        add_tag => [ "foo_%{somefield}", "taggedy_tag"]
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时将添加一个标签 foo_hello(第二个示例当然会添加一个 taggedy_tag 标签)。

enable_metric

编辑

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

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

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

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

id 字段中的变量替换仅支持环境变量,不支持使用来自 secret store 的值。

periodic_flush

编辑

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

remove_field

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

如果此过滤器成功,则从此事件中删除任意字段。字段名称可以是动态的,并使用 %{field} 包含事件的部分内容。示例

    filter {
      kv {
        remove_field => [ "foo_%{somefield}" ]
      }
    }
    # You can also remove multiple fields at once:
    filter {
      kv {
        remove_field => [ "foo_%{somefield}", "my_extraneous_field" ]
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时,如果存在,将删除名为 foo_hello 的字段。第二个示例将删除一个额外的非动态字段。

remove_tag

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

如果此过滤器成功,则从此事件中删除任意标签。标签可以是动态的,并使用 %{field} 语法包含事件的部分内容。

例子

    filter {
      kv {
        remove_tag => [ "foo_%{somefield}" ]
      }
    }
    # You can also remove multiple tags at once:
    filter {
      kv {
        remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"]
      }
    }

如果事件具有字段 "somefield" == "hello",则此过滤器在成功时,如果存在,将删除标签 foo_hello。第二个示例还将删除一个悲伤的、不需要的标签。