前言
从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://*.com/questions/30369148/logstash-remove-deep-field-from-json-file