前言
從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