ELK中logstash数据修改插件mutate的使用方法

filters/mutate 插件是 Logstash 另一个重要插件。它提供了丰富的基础类型数据处理能力。包括类型转换,字符串处理和字段处理等。
类型转换
类型转换是 filters/mutate 插件最初诞生时的唯一功能。其应用场景在之前 Codec/JSON 小节已经提到。
可以设置的转换类型包括:"integer","float" 和 "string"。示例如下:

01.
filter {
02.
  mutate {
03.
    convert => ["request_time", "float"]
04.
  }
05.
}

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

01.
gsub => ["urlparams", "[\\?#]", "_"]

split

01.
filter {
02.
  mutate {
03.
    split => ["message", "|"]
04.
  }
05.
}

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

01.
{
02.
  "message" => [
03.
    [0] "123",
04.
    [1] "321",
05.
    [2] "adfd",
06.
    [3] "dfjld*=123"
07.
  ],
08.
  "@version" => "1",
09.
  "@timestamp" => "2014-08-20T15:58:23.120Z",
10.
  "host" => "raochenlindeMacBook-Air.local"
11.
}

join
仅对数组类型字段有效
我们在之前已经用 split 割切的基础再 join 回去。配置改成:

01.
filter {
02.
  mutate {
03.
    split => ["message", "|"]
04.
  }
05.
  mutate {
06.
    join => ["message", ","]
07.
  }
08.
}

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

01.
{
02.
  "message" => "123,321,adfd,dfjld*=123",
03.
  "@version" => "1",
04.
  "@timestamp" => "2014-08-20T16:01:33.972Z",
05.
  "host" => "raochenlindeMacBook-Air.local"
06.
}

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

01.
filter {
02.
  mutate {
03.
    split => ["message", "|"]
04.
  }
05.
  mutate {
06.
    merge => ["message", "message"]
07.
  }
08.
}

我们会看到输出:

01.
{
02.
  "message" => [
03.
     [0] "123",
04.
     [1] "321",
05.
     [2] "adfd",
06.
     [3] "dfjld*=123",
07.
     [4] "123",
08.
     [5] "321",
09.
     [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":

01.
filter {
02.
  mutate {
03.
    split => ["message", "|"]
04.
  }
05.
  mutate {
06.
    merge => ["message", "host"]
07.
  }
08.
}

结果变成:

01.
{
02.
  "message" => [
03.
      [0] "123",
04.
      [1] "321",
05.
      [2] "adfd",
06.
      [3] "dfjld*=123",
07.
      [4] "raochenlindeMacBook-Air.local"
08.
],
09.
  "@version" => "1",
10.
   "@timestamp" => "2014-08-20T16:07:53.533Z",
11.
  "host" => [
12.
      [0] "raochenlindeMacBook-Air.local"
13.
    ]
14.
}

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

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

01.
strip
02.
lowercase
03.
uppercase

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

01.
filter {
02.
  mutate {
03.
    rename => ["syslog_host", "host"]
04.
  }
05.
}

update
更新某个字段的内容。如果字段不存在,不会新建。
replace
作用和 update 类似,但是当字段不存在的时候,它会起到 add_field 参数一样的效果,自动添加新的字段。
执行次序
需要注意的是,filter/mutate 内部是有执行次序的。其次序如下:

01.
rename(event) if @rename
02.
update(event) if @update
03.
replace(event) if @replace
04.
convert(event) if @convert
05.
gsub(event) if @gsub
06.
uppercase(event) if @uppercase
07.
lowercase(event) if @lowercase
08.
strip(event) if @strip
09.
remove(event) if @remove
10.
split(event) if @split
11.
join(event) if @join
12.
merge(event) if @merge
13.
filter_matched(event)


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/739

评论列表

0%