2015-03-31 371 views
1

我將日誌文件傳遞到logstash中,然後再推送到elasticsearch。logstash - 刪除字段中的所有非數字字符

一,我有字段有時會出現一系列的數字

foobar = 42 

有時帶有前綴字母

foobar = ws-42 

我要確保現場始終是一個整數,並且如果存在任何非數字,則將其刪除。

這裏是logstash配置的一部分,這使得確保該字段是一個整數,如果存在

filter { 
    mutate { 
    convert => [ "foobar", "integer"] 
    } 
} 

我怎樣才能去除出字符?

更新

通過使用發生變異濾波器我可以剝離非數值,或我可以轉換爲整數。但是,如果我嘗試做兩個,則返回0。

input { 
    stdin {} 
} 

filter { 
    kv { } 
    mutate { 
    gsub => [ "foobar", "\D", "" ] 
    convert => [ "foobar", "integer" ] 
    } 
} 

這裏是輸出。請注意,如果提供了「42」,然後foobar的返回42的整數,但是如果你提供「SW-42」 foobar的返回0

foobar="42" 
{ 
     "message" => "foobar=\"42\"", 
     "@version" => "1", 
    "@timestamp" => "2015-03-31T22:32:11.718Z", 
      "host" => "swat-logstash02", 
     "foobar" => 42 
} 
foobar="sw-42" 
{ 
     "message" => "foobar=\"sw-42\"", 
     "@version" => "1", 
    "@timestamp" => "2015-03-31T22:32:23.822Z", 
      "host" => "swat-logstash02", 
     "foobar" => 0 
} 

回答

3

這是一個範圍界定問題。

如果你做的正好GSUB(無轉換),它表明正則表達式的工作:

{ 
     "message" => "foobar=\"sw-42\"", 
     "@version" => "1", 
    "@timestamp" => "2015-03-31T22:42:40.097Z", 
      "host" => "0.0.0.0", 
     "foobar" => "42" 
} 

所以你應該運行它作爲兩個節:

filter { 
    kv { } 
    mutate { 
    gsub => [ "foobar", "\D", "" ] 
    } 
    mutate { 
    convert => [ "foobar", "integer" ] 
    } 
} 
相關問題