【问题标题】:Logstash json parseLogstash json 解析
【发布时间】:2018-10-26 19:53:02
【问题描述】:

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

Logstash 对我的支持真是令人惊讶,直到现在一切都很顺利:

input { s3 { ... } }

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

但是……现在 如果我立即给予:

output { elasticsearch { ... } }

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

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

之后我看到我的 JSON 中的每个孩子都被解析为 ES 中的分隔值 - 这是完美的,但如果我只想从 JSON 中发送 2 个或 3 个孩子怎么办?

我在 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”。

提前致谢

【问题讨论】:

    标签: json elasticsearch logstash


    【解决方案1】:

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

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

    但是,这有一个限制,您只能在顶级字段上执行此操作,因此不是您想要的。

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

    【讨论】:

      【解决方案2】:

      在 json 过滤器中使用 remove_field

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

      【讨论】:

      • 不幸的是,它对我不起作用:(。我正在添加remove_field,但最后,字段仍然到达ES索引:(
      • 也许检查语法或字段名称,因为它应该工作
      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多