【问题标题】:Logstash create nested fieldLogstash 创建嵌套字段
【发布时间】:2026-02-04 04:50:02
【问题描述】:

我有一些解析字符串的字段: 字符串示例:

"testmessage 10.5 100"

match => { "message" => "%{GREEDYDATA:text} %{NUMBER:duraton} %{NUMBER:code)"

输出将是

    {
       "text": "testmessage",
       "duraton": "10.5",
       "code": "100"
    }

但我想变成这样:

    {
       "text": "testmessage",
       "values": {
            "duraton": "10.5",
            "code": "100"
       }
    }

如何创建包含嵌套字段的字段“值”?

【问题讨论】:

    标签: filter nested match logstash


    【解决方案1】:

    语法是:

    %{NUMBER:[values][duraton]}
    

    请注意,您也可以将它们投射到 logstash 中:

    %{NUMBER:[values][duraton]:float}
    

    (“int”也可以)。

    【讨论】:

    • 我不行。我在grokdebug.herokuapp.com 中对此进行了测试。我明白了:10.5 100 => %{NUMBER:[values][duraton]} %{NUMBER:[values][code]} => { "[values][duraton]": [ "10.5" ], "[values][code]": [ "100" ] }
    • 我相信两个主要的 grok 调试器都不支持这种语法,但 logstash 肯定支持。在您自己的简单配置中尝试一下。
    • 使用 logstash 1.5.4 我在使用嵌套字段语法时得到Grok regexp threw exception {:exception=>"string not matched", :level=>:warn}--configtest 通过。如果我从%{NUMBER:[foo][bar]} 更改为%{NUMBER:foo_bar},它可以正常工作,所以我知道我的其他表达没有问题。
    • 还尝试将foo_bar 转换为[foo][bar]mutate,如下所示:discuss.elastic.co/t/best-way-to-create-nested-field/26757
    • 我已经取得了一些进展。如果 [foo] 以前作为字符串存在,grokmutate 将不允许您创建 [foo][bar]。但是,如果[foo][crud] 已经存在,它会很乐意让您添加[foo][bar][foo][baz] 等。它已经将[foo] 视为一个对象。有趣的是,kv 让你选择[foo] 中的target,即使它以前作为字符串存在,并将发现的键嵌套在那里。我将不得不查看源代码,看看kv 完成的“转换”是否也可以写入grokmutate
    【解决方案2】:

    正确的方法:

    %{GREEDYDATA:text} %{NUMBER:[values]duraton:float} %{NUMBER:[values]code:int)

    【讨论】: