我是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”。
预先感谢
答案 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", .. ]
}
}