1. 程式人生 > >Logstash下欄位以及巢狀Json欄位型別轉換

Logstash下欄位以及巢狀Json欄位型別轉換

 

前言

從filebeat傳輸到Logstash的資料,某個欄位需要由string型別裝換成float型別。但是不管怎麼改logstash的配置檔案都不生效,其實官方文件都有,但是具體細節方面的東西就得自己不斷的實踐驗證最後達到自己想要的目標了。整整一天,都在弄這一個,中間實在想放棄了。但是就如張靚穎的“終於等到你,還好沒放棄”,最後在某一篇博文得到了啟發,才解決。

 

這裡型別轉換分兩個型別:

1)欄位是單純的欄位,也就是直接在_source下的

2)欄位是在json裡的,在_source下還有巢狀一層json裡的欄位

 

一、單一欄位

可以從下面的圖中看出,欄位就在頂層機構_source下,這種情況下的Logstash配置檔案設定如下:

filter {
     mutate {
     convert => { "request_time" => "float" }
     convert => { "upstream_response_time" => "float" }
     }
}

 

 

 

 

二、巢狀Json下的欄位

如果需要轉換的欄位是在非頂級結構下,是在一個JSON裡,因為在filebeat做decode的時候指定了,如我需要轉換的欄位是在jsonn的json欄位裡:

processors:
 - decode_json_fields:
    fields: ["message"]    #要進行解析的欄位
    process_array: false   #陣列是否解碼,預設值:false
    max_depth: 3           #解碼深度,預設值:1
    target: "jsonn"          #json內容解析到指定的欄位,如果為空(“”),則解析到頂級結構下
    overwrite_keys: false  #如果解析出的json結構中某個欄位在原始的event(在filebeat中傳輸的一條資料為一個event)中也存在,是否覆蓋

 

 

 

這種情況下的Logstash配置檔案設定如下:

filter {
    mutate {
      convert => { "[jsonn][request_time]" => "float" }
      convert => { "[jsonn][upstream_response_time]" => "float" }
   }
}

 

注意:

[jsonn][request_time] 不是[jsonn].[request_time],也不是jsonn.request_time;沒有點.

 

受啟發的連結:

https://stackoverflow.com/questions/30369148/logstash-remove-deep-field-from-json-file

&n