数据修改(Mutate)

    类型转换是 filters/mutate 插件最初诞生时的唯一功能。其应用场景在之前 Codec/JSON 小节已经提到。

    可以设置的转换类型包括:”integer”,”float” 和 “string”。示例如下:

    注意:mutate 除了转换简单的字符值,还支持对数组类型的字段进行转换,即将 转换成 [1,2]。但不支持对哈希类型的字段做类似处理。有这方面需求的可以采用稍后讲述的 filters/ruby 插件完成。

    • gsub

    仅对字符串类型字段有效

    1. gsub => ["urlparams", "[\\?#]", "_"]
    • split
    1. filter {
    2. mutate {
    3. split => ["message", "|"]
    4. }
    5. }

    随意输入一串以|分割的字符,比如 “123|321|adfd|dfjld*=123”,可以看到如下输出:

    1. {
    2. "message" => [
    3. [0] "123",
    4. [1] "321",
    5. [2] "adfd",
    6. [3] "dfjld*=123"
    7. ],
    8. "@version" => "1",
    9. "@timestamp" => "2014-08-20T15:58:23.120Z",
    10. "host" => "raochenlindeMacBook-Air.local"
    11. }
    • join

    我们在之前已经用 split 割切的基础再 join 回去。配置改成:

    filter 区段之内,是顺序执行的。所以我们最后看到的输出结果是:

    1. {
    2. "message" => "123,321,adfd,dfjld*=123",
    3. "@version" => "1",
    4. "@timestamp" => "2014-08-20T16:01:33.972Z",
    5. "host" => "raochenlindeMacBook-Air.local"
    6. }

    合并两个数组或者哈希字段。依然在之前 split 的基础上继续:

    1. mutate {
    2. split => ["message", "|"]
    3. }
    4. mutate {
    5. merge => ["message", "message"]
    6. }
    7. }

    我们会看到输出:

    1. {
    2. "message" => [
    3. [0] "123",
    4. [1] "321",
    5. [2] "adfd",
    6. [3] "dfjld*=123",
    7. [4] "123",
    8. [5] "321",
    9. [6] "adfd",
    10. [7] "dfjld*=123"
    11. ],
    12. "@version" => "1",
    13. "@timestamp" => "2014-08-20T16:05:53.711Z",
    14. "host" => "raochenlindeMacBook-Air.local"
    15. }

    如果 src 字段是字符串,会自动先转换成一个单元素的数组再合并。把上一示例中的来源字段改成 “host”:

    1. {
    2. "message" => [
    3. [0] "123",
    4. [1] "321",
    5. [2] "adfd",
    6. [4] "raochenlindeMacBook-Air.local"
    7. "@version" => "1",
    8. "@timestamp" => "2014-08-20T16:07:53.533Z",
    9. "host" => [
    10. [0] "raochenlindeMacBook-Air.local"
    11. ]
    12. }

    看,目的字段 “message” 确实多了一个元素,但是来源字段 “host” 本身也由字符串类型变成数组类型了!

    下面你猜,如果来源位置写的不是字段名而是直接一个字符串,会产生什么奇特的效果呢?

    • strip
    • lowercase
    • uppercase
    • rename

    重命名某个字段,如果目的字段已经存在,会被覆盖掉:

    1. filter {
    2. mutate {
    3. rename => ["syslog_host", "host"]
    4. }
    5. }
    • update

    更新某个字段的内容。如果字段不存在,不会新建。

    • replace

    作用和 update 类似,但是当字段不存在的时候,它会起到 add_field 参数一样的效果,自动添加新的字段。

    1. rename(event) if @rename
    2. update(event) if @update
    3. replace(event) if @replace
    4. convert(event) if @convert
    5. gsub(event) if @gsub
    6. uppercase(event) if @uppercase
    7. lowercase(event) if @lowercase
    8. strip(event) if @strip
    9. remove(event) if @remove
    10. split(event) if @split
    11. join(event) if @join
    12. merge(event) if @merge

    filter_matched 这个 filters/base.rb 里继承的方法也是有次序的。