使用变量键名在Logstash中访问嵌套的JSON值

3

我有一个关于Logstash中JSON的问题。 我有一个JSON输入,看起来像这样:

{
"2": {
        "name": "name2",
        "state": "state2"
    },

"1": {
        "name": "name1",
        "state": "state1"
    },

"0": {
        "name": "name0",
        "state": "state0"
    }
}

现在,假设我想在logstash配置中添加一个字段。
json{
    source => "message"
    add_field => {
            "NAME" => "%{ What to write here ?}"
            "STATE" => "%{ What to write here ?}"
    }
}

有没有一种方法可以访问JSON输入,以便我获得一个名称为name1的字段值,另一个名称为name2的字段和第三个名称为name3的字段。JSON中的第一个键是可变的,这意味着可能只有一个或多个部分。所以我不想像硬编码那样去做。
%{[0][name]}

感谢您的帮助。
1个回答

2
如果您在输入中删除所有换行符,您可以简单地使用json filter。您不需要任何add_field操作。 没有换行符的工作配置:
filter {
        json { source => message }
}

如果您无法删除输入中的换行符,则需要使用多行编解码器合并这些行。
带有新行的工作配置如下:
input {   
    file {
        path => ["/path/to/your/file"] # I suppose your input is a file.
        start_position => "beginning"
        sincedb_path => "/dev/null" # just for testing
        codec => multiline {
            pattern => "^}"
            what => "previous"
            negate => "true"
        }
    }
}

filter {
    mutate { replace => { "message" => "%{message}}" }  }
    json { source => message }
}

我猜你使用了文件输入。如果没有,只需更改它。

输出 (适用于两种情况):

"2" => {
     "name" => "name2",
    "state" => "state2"
},
"1" => {
     "name" => "name1",
    "state" => "state1"
},
"0" => {
     "name" => "name0",
    "state" => "state0"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接