2016-06-21 249 views
1

我有以下JSON作爲輸入到我的Logstash管道:嵌套JSON解析在Logstash

{ 
    "action": "UPLOAD", 
    "who": "123", 
    "when": "2016 Jun 14 12:00:12", 
    "data": { 
    "doc_id": "2345", 
    "doc_name": "xyz.pdf" 
    }, 
    "header": { 
    "proj_id": "P123", 
    "logtype": "userlogs" 
    }, 
    "comments": "Check comments" 
} 

我想執行以下操作:

1)解析此JSON -使得i有一個新的字段「user」,值爲JSON中靜態字符串「User-」與「who」字段的連接。例如 - 「User-123」

2)僅存儲ES中的相關字段 - 例如ElasticSearch中的action,who,when,header.proj_id,header.logtype。並且留下其餘的字段而不存儲它們。

我嘗試使用以下配置,但目前它將我的JSON的所有字段存儲到彈性搜索中。

input { 
    rabbitmq { 
     type => "businesslogs" 
     host => "localhost" 
     exchange => "auditexchange" 
     exchange_type => "fanout" 
     queue => "auditqueue" 
     auto_delete => false 
     durable => true 
     ack => true 
     codec => json 
    } 
} 

output { 
    if [type] == "businesslogs" { 
     elasticsearch { 
      hosts => ["localhost:9200"] 
      index => "businesslogs" 
      document_type => "%{action}" 
     } 
    } 
} 

回答

1

你只需要添加一個mutate過濾器添加/刪除某些字段/從您的活動:

filter { 
    mutate { 
     add_field => { 
      "user" => "User-%{who}" 
     } 
     remove_field => ["data", "comments"] 
    } 
} 
+0

謝謝...它爲我工作。也有可能,我可以指定一個字段作爲臨時變量使用,而不是存儲到ES中。例如 - 我可以使用「action」字段來指定ES的「document_type」,而不是將它用作索引的字段。 – SuperCoder

+0

是的,你可以添加一個字段然後刪除它,或者簡單地創建一個'[@metadata] [tmp_field]'字段,它不會被保存在ES中。 – Val