Logstash嵌套JSON Parse

时间:2017-11-07 16:38:34

标签: json ruby logstash

我有一个Logstash配置,它接收来自Kafka的JSON输入并将其发送到Elasticsearch Output。

收到的JSON具有以下结构:

TrackingData: {
    "path": "/hello/world",
    "method": "GET",
    "requestDateTime": "2017-11-07T16:12:02.635",
    "duration": 5104684,
    "status": 200
}

我想将status值添加为新字段,以便稍后在使用Kibana查看EL数据时可以在新列中显示。我理解为此,我应该在Logstash配置中包含mutate filter

为了从JSON结构中获取status值并进入新字段,Ruby字符串应该是什么?

我的Logstash配置目前如下:

input {
    kafka {
        bootstrap_servers => ["kafka:9092"]
        topics => "test-topic"
        group_id => "test-topic-group"
    }
}
filter {
    mutate {
        add_field => {
            "root_field" => "%{[message]}"
            "status_field" => "%{[message][TrackingData][status]}"
        }
    }
}
output {
    stdout {
        codec => rubydebug
    }   
    elasticsearch {
        hosts => ["elk:9200"]
}

当Logstash处理消息时,我可以在Kibana中看到root_field解析好了(我添加了这个字段只是为了证明json是可解析的)但是status_field显示为Kibana中的%{[message][TrackingData][status]}(即解析字符串必须不正确)。

如何指定解析String以便从上面的示例JSON结构中获取status值?

1 个答案:

答案 0 :(得分:0)

有两件事是错的。第一个问题是收到的JSON本身是错误的。 "中未"TrackingData": { "path": "/hello/world", "method": "GET", "requestDateTime": "2017-11-07T16:12:02.635", "duration": 5104684, "status": 200 } 包围codec => "json"。正确的JSON应该是这样的:

filter

其次,我在Logstash的配置中添加了input { kafka { bootstrap_servers => ["kafka:9092"] topics => "test-topic" group_id => "test-topic-group" codec => "json" } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["elk:9200"] } 并删除了constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long) : this(HashMap()) { 代码块:

: this(HashMap())

现在,收到了JSON'键/值被解析为单独的字段,因此可以根据需要在Kibana中的单独列中显示(或者根本不需要时将其过滤掉)。

Kibana screen grab showing JSON fields in separate columns