1. 程式人生 > 實用技巧 >Logstash 過濾外掛 Mutate(資料修改)

Logstash 過濾外掛 Mutate(資料修改)

簡介

  資料修改外掛 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" }
      }
    }