Kv 过滤器插件编辑

  • 插件版本:v4.7.0
  • 发布日期:2022-03-04
  • 变更日志

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

获取帮助编辑

如果您对插件有任何疑问,请在 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 查询字符串的示例

例如,要从类似于 ?pin=12345~0&d=123&[email protected]&oq=bobo&ss=12345 的 URL 查询字符串中分割参数

    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" } }

targetedit

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

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

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

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

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

tag_on_failureedit

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

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

tag_on_timeoutedit

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

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

timeout_millisedit

  • 值类型为 number
  • 此设置的默认值为 30000(30 秒)。
  • 设置为零 (0) 以禁用超时

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

transform_keyedit

  • 值可以是以下任何一种:lowercaseuppercasecapitalize
  • 此设置没有默认值。

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

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

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

transform_valueedit

  • 值可以是以下任何一种:lowercaseuppercasecapitalize
  • 此设置没有默认值。

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

例如,将所有值的首字母大写

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

trim_keyedit

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

要从键中修剪的字符字符串。如果您的键包含在括号中或以空格开头,这将很有用。

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

仅从键中修剪前导和尾随字符。

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

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

trim_valueedit

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

用于转换检查的常量要从值中修剪的字符字符串。如果您的值包含在括号中或以逗号结尾(如后缀日志),这将很有用。

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

仅从值中修剪前导和尾随字符。

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

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

value_splitedit

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

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

例如,要识别诸如 key1:value1 key2:value2 之类的键值

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

value_split_patternedit

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

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

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

请参阅 field_split_pattern 以获取示例。

whitespaceedit

  • 值可以是以下任何一种:lenientstrict
  • 默认值为 lenient

一个选项,指定在接受配置的值分隔符周围的非必要空格时是宽松还是严格

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

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

常用选项edit

以下配置选项受所有过滤器插件支持

add_fieldedit

  • 值类型为 hash
  • 默认值为 {}

如果此过滤器成功,则将任何任意字段添加到此事件。字段名称可以是动态的,并使用 %{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_tagedit

  • 值类型为 array
  • 默认值为 []

如果此过滤器成功,则将任意标签添加到事件。标签可以是动态的,并使用 %{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_metricedit

  • 值类型为 boolean
  • 默认值为 true

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

idedit

  • 值类型为 string
  • 此设置没有默认值。

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

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

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

periodic_flushedit

  • 值类型为 boolean
  • 默认值为 false

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

remove_fieldedit

  • 值类型为 array
  • 默认值为 []

如果此过滤器成功,则从此事件中删除任意字段。字段名称可以是动态的,并使用 %{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_tagedit

  • 值类型为 array
  • 默认值为 []

如果此过滤器成功,则从事件中删除任意标签。标签可以是动态的,并使用 %{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(如果存在)。第二个示例还将删除一个令人沮丧的、不需要的标签。