简介
数据修改插件 Mutate 提供了丰富的基础数据处理能力。包括事件中字符串处理,类型转换、字段处理等。
处理顺序
配置文件中的数据修改按如下的顺序执行:
- coerce
- rename
- update
- replace
- convert
- gsub
- uppercase
- capitalize
- lowercase
- strip
- remove
- split
- join
- merge
- copy
可以将 mutate 模块分隔开以控制数据修改的顺序,例如:
filter { mutate { split => ["hostname", "."] add_field => { "shortHostname" => "%{hostname[0]}" } } mutate { rename => ["shortHostname", "hostname" ] } }
Mutate 过滤器配置选项
类型转换
Convert 类型转换可以转换字段值的类型,例如将字符串转换为整数。如果字段值是数组,则会转换数组中的所有元素。如果字段值为哈希,则不会采取任何措施。
可以设置的转换类型包括:"integer"、"integer_eu"、"float"、"float_eu"、"string"、"boolean"。示例如下:
filter { mutate { convert => { "fieldname" => "integer" "booleanfield" => "boolean" } } }
注意:当转换数组类型的字段时,可以将 ["1","2"] 转换成 [1, 2]。但不支持对哈希类型的字段做类似处理。
字符串处理
- gsub
根据字段值匹配正则表达式,然后将所有匹配项替换为替代字符串。只有当字段值为字符串或者数组中的值为字符串才支持。
filter { mutate { gsub => [ # 用下划线替换所有正斜杠 "fieldname", "/", "_", # 用点替换反斜杠、问好、井号、负号 "fieldname2", "[\\?#-]", "." ] } }
注意:在配置文件需要格外注意反斜杆的转义。
- split
使用分隔符将字段拆分为数组。仅对字符串类型的字段有效。例如用 | 分隔符分隔一串字符串:
filter { mutate { split => ["message", "|"] } } { "message" => [ [0] "123", [1] "321", [2] "adfd", [3] "dfjld*=123" ], 。。。 }
- join
用分隔符将数组里的数据连接起来。仅对数组类型字段有效。
filter { mutate { split => ["message", "|"] } mutate { join => ["message", ","] } } { "message" => "123,321,adfd,dfjld*=123", 。。。 }
- merge
合并两个数组或哈希字段。字符串类型的字段将会被自动转换成数组,所以:
`array` + `string` will work `string` + `string` will result in an 2 entry array in `dest_field` `array` and `hash` will not work
字段处理
- rename
重命名某个字段,如果目的字段已经存在,则会被覆盖掉:
filter { mutate { rename => ["syslog_host", "host"] } }
- update
更新某个字段的浽容。如果字段不存在,不会新建。
filter { mutate { update => { "sample" => "My new message" } } }
- replace
作用和 update 类似,但是当字段不存在时,会起到 add_field 参数一样的效果,自动添加新字段。
filter { mutate { replace => { "message" => "%{source_host}: My new message" } } }