logstash的mutate插件


數據修改(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", "|"]
        }
    }
  • 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 => ["host", "host_syslog"]
        }
    }
  • update
    更新某個字段的內容。如果字段不存在,不會新建。
  • replace
    作用和 update 類似,但是當字段不存在的時候,它會起到 add_field 參數一樣的效果,自動添加新的字段。

執行次序

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

 coerce 
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 copy(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

Mutate 過濾器配置選項

mutate 過濾器可以使用許多配置選項,例如copy,rename,replace,join, uppercase 及 lowercase。

下表概述了它們:

配置選項 用途
add_field 向事件中添加新字段
remove_field 從事件中刪除任意字段
add_tag 向事件中添加任意標簽
remove_tag 從事件中刪除標簽(如果存在)
convert 將字段值轉換為另一種數據類型
id 想現場時間添加唯一的ID
lowercase 將字符串字段轉換為小寫形式
replace 用新值替換字段
strip 刪除開頭和結尾的空格
uppercase 將字符串字段轉換為等效的大寫字母
update 用新值更新現有的字段
rename 重命名時間中的字段
gsub 用於查找和替換字符串中的替換
merge 合並數組或 hash 事件

 轉載自:https://blog.csdn.net/UbuntuTouch/article/details/106466873

參考資料:https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM