1. 程式人生 > >Logstash過濾器修改數據

Logstash過濾器修改數據

host clas spa mac 處理 version 之前 practice book

數據修改(Mutate)

filters/mutate 插件是 Logstash 另一個重要插件。它提供了豐富的基礎類型數據處理能力。包括類型轉換,字符串處理和字段處理等。

類型轉換

類型轉換是 filters/mutate 插件最初誕生時的唯一功能。其應用場景在之前 Codec/JSON 小節已經提到。

可以設置的轉換類型包括:"integer","float" 和 "string"。示例如下:

filter {
    mutate {
        convert => ["request_time", "float"]
    }
}

註意:mutate 除了轉換簡單的字符值,還支持對數組類型的字段進行轉換,即將 ["1","2"]

轉換成[1,2]。但不支持對哈希類型的字段做類似處理。有這方面需求的可以采用稍後講述的 filters/ruby 插件完成。

字符串處理

  • gsub

僅對字符串類型字段有效

gsub => ["urlparams", "[\\?#]", "_"]
  • split
filter {
    mutate {
        split => ["message", "|"]
    }
}

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

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

僅對數組類型字段有效

我們在之前已經用 split 割切的基礎再 join 回去。配置改成:

filter {
    mutate {
        split 
=> ["message", "|"] } mutate { join => ["message", ","] } }

filter 區段之內,是順序執行的。所以我們最後看到的輸出結果是:

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

合並兩個數組或者哈希字段。依然在之前 split 的基礎上繼續:

filter {
    mutate {
        split => ["message", "|"]
    }
    mutate {
        merge => ["message", "message"]
    }
}

我們會看到輸出:

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

如果 src 字段是字符串,會自動先轉換成一個單元素的數組再合並。把上一示例中的來源字段改成 "host":

filter {
    mutate {
        split => ["message", "|"]
    }
    mutate {
        merge => ["message", "host"]
    }
}

結果變成:

{
       "message" => [
        [0] "123",
        [1] "321",
        [2] "adfd",
        [3] "dfjld*=123",
        [4] "raochenlindeMacBook-Air.local"
    ],
      "@version" => "1",
    "@timestamp" => "2014-08-20T16:07:53.533Z",
          "host" => [
        [0] "raochenlindeMacBook-Air.local"
    ]
}

看,目的字段 "message" 確實多了一個元素,但是來源字段 "host" 本身也由字符串類型變成數組類型了!

下面你猜,如果來源位置寫的不是字段名而是直接一個字符串,會產生什麽奇特的效果呢?

  • strip
  • lowercase
  • uppercase

字段處理

  • rename

重命名某個字段,如果目的字段已經存在,會被覆蓋掉:

filter {
    mutate {
        rename => ["syslog_host", "host"]
    }
}
  • update

更新某個字段的內容。如果字段不存在,不會新建。

  • replace

作用和 update 類似,但是當字段不存在的時候,它會起到 add_field 參數一樣的效果,自動添加新的字段。

執行次序

需要註意的是,filter/mutate 內部是有執行次序的。其次序如下:

    rename(event) if @rename
    update(event) if @update
    replace(event) if @replace
    convert(event) if @convert
    gsub(event) if @gsub
    uppercase(event) if @uppercase
    lowercase(event) if @lowercase
    strip(event) if @strip
    remove(event) if @remove
    split(event) if @split
    join(event) if @join
    merge(event) if @merge

    filter_matched(event)

filter_matched 這個 filters/base.rb 裏繼承的方法也是有次序的。

  @add_field.each do |field, value|
  end
  @remove_field.each do |field|
  end
  @add_tag.each do |tag|
  end
  @remove_tag.each do |tag|
  end

Logstash過濾器修改數據