繁体   English   中英

Logstash json解析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM