Logstash詳解之——filter模組
Logstash三個元件的第二個元件,也是真個Logstash工具中最複雜,最蛋疼的一個元件,當然,也是最有作用的一個元件。
1、grok外掛 grok外掛有非常強大的功能,他能匹配一切資料,但是他的效能和對資源的損耗同樣讓人詬病。
filter{
grok{
#只說一個match屬性,他的作用是從message 欄位中吧時間給摳出來,並且賦值給另個一個欄位logdate。
#首先要說明的是,所有文字資料都是在Logstash的message欄位中中的,我們要在過濾器裡操作的資料就是message。
#第二點需要明白的是grok外掛是一個十分耗費資源的外掛,這也是為什麼我只打算講解一個TIMESTAMP_ISO8601正規表示式的原因。
#第三點需要明白的是,grok有超級多的預裝正規表示式,這裡是沒辦法完全搞定的,也許你可以從這個大神的文章中找到你需要的表示式
#http://blog.csdn.net/liukuan73/article/details/52318243
#但是,我還是不建議使用它,因為他完全可以用別的外掛代替,當然,對於時間這個屬性來說,grok是非常便利的。
match => [`message`,`%{TIMESTAMP_ISO8601:logdate}`]
}
}
2、mutate外掛 mutate外掛是用來處理資料的格式的,你可以選擇處理你的時間格式,或者你想把一個字串變為數字型別(當然需要合法),同樣的你也可以返回去做。可以設定的轉換型別 包括: "integer", "float" 和 "string"。
filter {
mutate {
#接收一個陣列,其形式為value,type
#需要注意的是,你的資料在轉型的時候要合法,你總是不能把一個‘abc’的字串轉換為123的。
convert => [
#把request_time的值裝換為浮點型
"request_time", "float",
#costTime的值轉換為整型
"costTime", "integer"
]
}
}
3、ruby外掛 官方對ruby外掛的介紹是——無所不能。ruby外掛可以使用任何的ruby語法,無論是邏輯判斷,條件語句,迴圈語句,還是對字串的操作,對EVENT物件的操作,都是極其得心應手的。
filter {
ruby {
#ruby外掛有兩個屬性,一個init 還有一個code
#init屬性是用來初始化欄位的,你可以在這裡初始化一個欄位,無論是什麼型別的都可以,這個欄位只是在ruby{}作用域裡面生效。
#這裡我初始化了一個名為field的hash欄位。可以在下面的coed屬性裡面使用。
init => [field={}]
#code屬性使用兩個冒號進行標識,你的所有ruby語法都可以在裡面進行。
#下面我對一段資料進行處理。
#首先,我需要在把message欄位裡面的值拿到,並且對值進行分割按照“|”。這樣分割出來的是一個陣列(ruby的字元創處理)。
#第二步,我需要迴圈陣列判斷其值是否是我需要的資料(ruby條件語法、迴圈結構)
#第三步,我需要吧我需要的欄位新增進入EVEVT物件。
#第四步,選取一個值,進行MD5加密
#什麼是event物件?event就是Logstash物件,你可以在ruby外掛的code屬性裡面操作他,可以新增屬性欄位,可以刪除,可以修改,同樣可以進行樹脂運算。
#進行MD5加密的時候,需要引入對應的包。
#最後把冗餘的message欄位去除。
code => "
array=event。get(`message`).split(`|`)
array.each do |value|
if value.include? `MD5_VALUE`
then
require `digest/md5`
md5=Digest::MD5.hexdigest(value)
event.set(`md5`,md5)
end
if value.include? `DEFAULT_VALUE`
then
event.set(`value`,value)
end
end
remove_field=>"message"
"
}
}
4、date外掛 這裡需要合前面的grok外掛剝離出來的值logdate配合使用(當然也許你不是用grok去做)。
filter{
date{
#還記得grok外掛剝離出來的欄位logdate嗎?就是在這裡使用的。你可以格式化為你需要的樣子,至於是什麼樣子。就得你自己取看啦。
#為什什麼要格式化?
#對於老資料來說這非常重要,應為你需要修改@timestamp欄位的值,如果你不修改,你儲存進ES的時間就是系統但前時間(+0時區)
#單你格式化以後,就可以通過target屬性來指定到@timestamp,這樣你的資料的時間就會是準確的,這對以你以後圖表的建設來說萬分重要。
#最後,logdate這個欄位,已經沒有任何價值了,所以我們順手可以吧這個欄位從event物件中移除。
match=>["logdate","dd/MMM/yyyy:HH:mm:ss Z"]
target=>"@timestamp"
remove_field => `logdate`
#還需要強調的是,@timestamp欄位的值,你是不可以隨便修改的,最好就按照你資料的某一個時間點來使用,
#如果是日誌,就使用grok把時間摳出來,如果是資料庫,就指定一個欄位的值來格式化,比如說:"timeat", "%{TIMESTAMP_ISO8601:logdate}"
#timeat就是我的資料庫的一個關於時間的欄位。
#如果沒有這個欄位的話,千萬不要試著去修改它。
}
}
5、json外掛,這個外掛也是極其好用的一個外掛,現在我們的日誌資訊,基本都是由固定的樣式組成的,我們可以使用json外掛對其進行解析,並且得到每個欄位對應的值。
filter{
#source指定你的哪個值是json資料。
json {
source => "value"
}
#注意:如果你的json資料是多層的,那麼解析出來的資料在多層結裡是一個陣列,你可以使用ruby語法對他進行操作,最終把所有資料都裝換為平級的。
}
json外掛還是需要注意一下使用的方法的,下圖就是多層結構的弊端:
對應的解決方案為:
ruby{
code=>"
kv=event.get(`content`)[0]
kv.each do |k,v|
event.set(k,v)
end"
remove_field => [`content`,`value`,`receiptNo`,`channelId`,`status`]
}
Logstash filter元件的外掛基本介紹到這裡了,這裡需要明白的是:
add_field、remove_field、add_tag、remove_tag 是所有 Logstash 外掛都有。相關使用反法看欄位名就可以知道。不如你也試試吧。。。。
相關文章
- Logstash詳解之——output模組
- Logstash詳解之——input模組
- javaweb之Filter詳解(轉)JavaWebFilter
- Logstash使用詳解
- HBase Filter 過濾器之 ValueFilter 詳解Filter過濾器
- 詳解Kalman FilterFilter
- Python之time模組詳解Python
- Python之OS模組詳解Python
- Logstash學習記錄--logstash input output filter 外掛總結Filter
- AngularJS Filter用法詳解AngularJSFilter
- ES6之路之模組詳解
- Python之Requests模組使用詳解Python
- logstash-input-file 配置屬性詳解
- Nginx原始碼研究之nginx限流模組詳解Nginx原始碼
- Django之使用者認證模組詳解Django
- nginx image_filter模組NginxFilter
- 【dubbo之模組詳講】
- Python 解析配置模組之ConfigParser詳解Python
- 布隆過濾器(Bloom Filter)詳解過濾器OOMFilter
- 詳解卡爾曼濾波(Kalman Filter)原理Filter
- Java 中的 Filter 過濾器詳解JavaFilter過濾器
- Logstash讀取Kafka資料寫入HDFS詳解Kafka
- anjularjs-filter模組化JSFilter
- python模組詳解Python
- matplotlib模組詳解
- lms框架模組詳解框架
- difflib模組詳解
- psutil模組詳解
- 紅外模組詳解
- python之logging日誌模組詳解Python
- es6 map、foreach、reduce、 filter 詳解Filter
- Python os模組詳解Python
- NodeJs VM模組詳解NodeJS
- python docopt模組詳解Python
- python 詳解re模組Python
- import方法引入模組詳解Import
- Spring原始碼分析之spring-jms模組詳解Spring原始碼
- Filter(過濾器)與Listener(監聽器)詳解Filter過濾器