Logstash json解析

时间:2018-10-26 19:53:03

标签: json elasticsearch logstash

我是Logstash的新手,目前我正尝试从S3中读取文件(文件的每一行都是新的json)并解析JSON字段,仅将部分内容发送给ES。

Logstash如此支持我,真是令人惊讶,因为到目前为止一切都很顺利:

input { s3 { ... } }

我什至不需要明确地说文件是经过GZiped处理的,或者编解码器是JSON,这仍然让我感到惊讶,Logstash如何解决了这个问题。

但是...现在 如果我立即给出:

output { elasticsearch { ... } }

然后我所有的JSON正文都落入ElasticSearch内的“消息”字符串中。所以我这样做了:

filter { json { source => "message" } }

此后,我发现JSON中的每个子级都被解析为ES中的分隔值-完美无缺,但是如果我只想从JSON发送2个或3个子级给ES怎么办?

我在JSON中的示例结构:

{"path":"/h/asia","headers":{"x-forwarded-for":"1.1.1.1","user-agent":"Mozilla/5.0"},"params":{"filters_values":"test","pagecount":"2","user_status":"unlogged"},"meta":{"date":1538974058,"acceptCookies":true}}

因此,最后,我进入了ES,其字段如下:

"path.headers.x-forwarded-for", 
"params.pagecount", 
"params.user_status" etc.

我的目标是在ES中仅存储两个 “ params.filters_values”和“ headers.user_agent”。

预先感谢

2 个答案:

答案 0 :(得分:0)

您可以使用prune过滤器来选择所需的字段:

filter {
  prune {
    whitelist_names => [ "params", "headers" ]
  }
}

但是,这样做的局限性在于您只能在顶级字段上执行此操作,而不是您想要的。

https://www.elastic.co/guide/en/logstash/current/plugins-filters-prune.html

答案 1 :(得分:0)

在json过滤器中使用remove_field

filter {
  json {
    source => "message"
    remove_field => [ "path.headers.x-forwarded-for", "params.pagecount", .. ]
  }
}