[英]Logstash json parse
我是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”之类的两个。
提前致谢
您可以使用prune
过滤器选择所需的字段:
filter {
prune {
whitelist_names => [ "params", "headers" ]
}
}
但是,这具有局限性,您只能在顶级字段上执行此操作,而不能完全满足您的要求。
https://www.elastic.co/guide/zh-CN/logstash/current/plugins-filters-prune.html
在json过滤器中使用remove_field
filter {
json {
source => "message"
remove_field => [ "path.headers.x-forwarded-for", "params.pagecount", .. ]
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.