我有一个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
值?
答案 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中的单独列中显示(或者根本不需要时将其过滤掉)。