Logstash三個(gè)組件的第二個(gè)組件,也是整個(gè)Logstash工具中最復(fù)雜例衍,最蛋疼的一個(gè)組件昔期,當(dāng)然,也是最有作用的一個(gè)組件佛玄。
1硼一、grok插件 grok插件有非常強(qiáng)大的功能,他能匹配一切數(shù)據(jù)翎嫡,但是他的性能和對(duì)資源的損耗同樣讓人詬病欠动。
filter{
? ? grok{
? ? ? ? #只說(shuō)一個(gè)match屬性,他的作用是從message 字段中吧時(shí)間給摳出來(lái)惑申,并且賦值給另個(gè)一個(gè)字段logdate具伍。
? ? ? ? #首先要說(shuō)明的是,所有文本數(shù)據(jù)都是在Logstash的message字段中中的圈驼,我們要在過(guò)濾器里操作的數(shù)據(jù)就是message人芽。
? ? ? ? #第二點(diǎn)需要明白的是grok插件是一個(gè)十分耗費(fèi)資源的插件,這也是為什么我只打算講解一個(gè)TIMESTAMP_ISO8601正則表達(dá)式的原因绩脆。
? ? ? ? #第三點(diǎn)需要明白的是萤厅,grok有超級(jí)多的預(yù)裝正則表達(dá)式,這里是沒(méi)辦法完全搞定的靴迫,也許你可以從這個(gè)大神的文章中找到你需要的表達(dá)式
? ? ? ? #http://blog.csdn.net/liukuan73/article/details/52318243
? ? ? ? #但是惕味,我還是不建議使用它,因?yàn)樗耆梢杂脛e的插件代替玉锌,當(dāng)然名挥,對(duì)于時(shí)間這個(gè)屬性來(lái)說(shuō),grok是非常便利的主守。
? ? ? ? match => ['message','%{TIMESTAMP_ISO8601:logdate}']
? ? }
}
2禀倔、mutate插件 mutate插件是用來(lái)處理數(shù)據(jù)的格式的榄融,你可以選擇處理你的時(shí)間格式,或者你想把一個(gè)字符串變?yōu)閿?shù)字類(lèi)型(當(dāng)然需要合法)救湖,同樣的你也可以返回去做愧杯。可以設(shè)置的轉(zhuǎn)換類(lèi)型 包括: "integer"鞋既, "float" 和 "string"力九。
filter {
? ? mutate {
? ? ? ? #接收一個(gè)數(shù)組,其形式為value涛救,type
? ? ? ? #需要注意的是畏邢,你的數(shù)據(jù)在轉(zhuǎn)型的時(shí)候要合法,你總是不能把一個(gè)‘a(chǎn)bc’的字符串轉(zhuǎn)換為123的检吆。
? ? ? ? convert => [
? ? ? ? ? ? ? ? ? ? #把request_time的值裝換為浮點(diǎn)型
? ? ? ? ? ? ? ? ? ? "request_time", "float"舒萎,
? ? ? ? ? ? ? ? ? ? #costTime的值轉(zhuǎn)換為整型
? ? ? ? ? ? ? ? ? ? "costTime", "integer"
? ? ? ? ? ? ? ? ? ? ]
? ? }
}
我的logstash是從kafka中讀取數(shù)據(jù),取出來(lái)的數(shù)據(jù)格式為"zhangsan_1_25_student_15064573848"蹭沛;一個(gè)人的姓名_性別_年齡_職業(yè)_時(shí)間戳臂寝,我的需求是將每個(gè)字段分別存到elasticsearch中,所以首先需要對(duì)取出來(lái)的字符串拆分摊灭,以便模板能映射各個(gè)字段
filter{
? ? mutate{
? ? ? ? split=>["message","_"] ?//使用split以下劃線進(jìn)行拆分
? ? ? ? add_field => { ?//由于拆分完咆贬,只有值,沒(méi)有字段名帚呼,所以還要使用add_field添加字段
? ? ? ? ? "name" => "%{[message][0]}"
? ? ? ? }
? ? ? ? add_field => {
? ? ? ? ? "gender" => "%{[message][1]}"
? ? ? ? }
? ? ? ? add_field => {
? ? ? ? ? "age" => "%{[message][2]}"
? ? ? ? }
? ? ? ? add_field => {
? ? ? ? ? "job" => "%{[message][3]}"
? ? ? ? }
? ? ? ? add_field => {
? ? ? ? ? "time" => "%{[message][4]}"
? ? ? ? }
? ? ? ? remove_field => ["message"]
? ? }
? ? mutate{ //要轉(zhuǎn)換字段掏缎,請(qǐng)重新再添加一個(gè)mutate
? ? ? ? convert => { "gender" => "integer"} ??//由于拆分完每個(gè)都是字符串,而對(duì)于age等字段我想存儲(chǔ)為整型煤杀,所以要
? ? ? ? convert => { "age" => "integer"}
? ? ? ? convert => { "time" => "integer"}
? ? }
}
更多更詳細(xì)的配置說(shuō)明眷蜈,請(qǐng)見(jiàn)
https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-update
3、ruby插件 官方對(duì)ruby插件的介紹是——無(wú)所不能沈自。ruby插件可以使用任何的ruby語(yǔ)法酌儒,無(wú)論是邏輯判斷,條件語(yǔ)句枯途,循環(huán)語(yǔ)句忌怎,還是對(duì)字符串的操作,對(duì)EVENT對(duì)象的操作酪夷,都是極其得心應(yīng)手的榴啸。
filter {
? ? ruby {
? ? ? ? #ruby插件有兩個(gè)屬性,一個(gè)init 還有一個(gè)code
? ? ? ? #init屬性是用來(lái)初始化字段的晚岭,你可以在這里初始化一個(gè)字段插掂,無(wú)論是什么類(lèi)型的都可以,這個(gè)字段只是在ruby{}作用域里面生效。
? ? ? ? #這里我初始化了一個(gè)名為field的hash字段辅甥。可以在下面的coed屬性里面使用燎竖。
? ? ? ? init => [field={}]
? ? ? ? #code屬性使用兩個(gè)冒號(hào)進(jìn)行標(biāo)識(shí)璃弄,你的所有ruby語(yǔ)法都可以在里面進(jìn)行。
? ? ? ? #下面我對(duì)一段數(shù)據(jù)進(jìn)行處理构回。
? ? ? ? #首先夏块,我需要在把message字段里面的值拿到,并且對(duì)值進(jìn)行分割按照“|”纤掸。這樣分割出來(lái)的是一個(gè)數(shù)組(ruby的字符創(chuàng)處理)脐供。
? ? ? ? #第二步,我需要循環(huán)數(shù)組判斷其值是否是我需要的數(shù)據(jù)(ruby條件語(yǔ)法借跪、循環(huán)結(jié)構(gòu))
? ? ? ? #第三步政己,我需要吧我需要的字段添加進(jìn)入EVEVT對(duì)象。
? ? ? ? #第四步掏愁,選取一個(gè)值歇由,進(jìn)行MD5加密
? ? ? ? #什么是event對(duì)象?event就是Logstash對(duì)象果港,你可以在ruby插件的code屬性里面操作他沦泌,可以添加屬性字段,可以刪除辛掠,可以修改谢谦,同樣可以進(jìn)行樹(shù)脂運(yùn)算。
? ? ? ? #進(jìn)行MD5加密的時(shí)候萝衩,需要引入對(duì)應(yīng)的包回挽。
? ? ? ? #最后把冗余的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插件剝離出來(lái)的值logdate配合使用(當(dāng)然也許你不是用grok去做)。
filter{
? ? date{
? ? ? ? #還記得grok插件剝離出來(lái)的字段logdate嗎预柒?就是在這里使用的队塘。你可以格式化為你需要的樣子总处,至于是什么樣子巩剖。就得你自己取看啦。
? ? ? ? #為什什么要格式化鲜滩?
? ? ? ? #對(duì)于老數(shù)據(jù)來(lái)說(shuō)這非常重要淋袖,應(yīng)為你需要修改@timestamp字段的值鸿市,如果你不修改,你保存進(jìn)ES的時(shí)間就是系統(tǒng)但前時(shí)間(+0時(shí)區(qū))
? ? ? ? #單你格式化以后,就可以通過(guò)target屬性來(lái)指定到@timestamp焰情,這樣你的數(shù)據(jù)的時(shí)間就會(huì)是準(zhǔn)確的陌凳,這對(duì)以你以后圖表的建設(shè)來(lái)說(shuō)萬(wàn)分重要。
? ? ? ? #最后内舟,logdate這個(gè)字段合敦,已經(jīng)沒(méi)有任何價(jià)值了,所以我們順手可以吧這個(gè)字段從event對(duì)象中移除验游。
? ? ? ? match=>["logdate","dd/MMM/yyyy:HH:mm:ss Z"]
? ? ? ? target=>"@timestamp"
? ? ? ? remove_field => 'logdate'
? ? ? ? #還需要強(qiáng)調(diào)的是充岛,@timestamp字段的值,你是不可以隨便修改的耕蝉,最好就按照你數(shù)據(jù)的某一個(gè)時(shí)間點(diǎn)來(lái)使用崔梗,
? ? ? ? #如果是日志,就使用grok把時(shí)間摳出來(lái)垒在,如果是數(shù)據(jù)庫(kù)蒜魄,就指定一個(gè)字段的值來(lái)格式化,比如說(shuō):"timeat", "%{TIMESTAMP_ISO8601:logdate}"
? ? ? ? #timeat就是我的數(shù)據(jù)庫(kù)的一個(gè)關(guān)于時(shí)間的字段爪膊。
? ? ? ? #如果沒(méi)有這個(gè)字段的話权悟,千萬(wàn)不要試著去修改它。
? ? }
}
5推盛、json插件峦阁,這個(gè)插件也是極其好用的一個(gè)插件,現(xiàn)在我們的日志信息耘成,基本都是由固定的樣式組成的榔昔,我們可以使用json插件對(duì)其進(jìn)行解析,并且得到每個(gè)字段對(duì)應(yīng)的值瘪菌。
filter{
? ? #source指定你的哪個(gè)值是json數(shù)據(jù)撒会。
? ? json {
? ? ? ? source => "value"
? ? }
? ? #注意:如果你的json數(shù)據(jù)是多層的,那么解析出來(lái)的數(shù)據(jù)在多層結(jié)里是一個(gè)數(shù)組师妙,你可以使用ruby語(yǔ)法對(duì)他進(jìn)行操作诵肛,最終把所有數(shù)據(jù)都裝換為平級(jí)的。
}
?json插件還是需要注意一下使用的方法的默穴,下圖就是多層結(jié)構(gòu)的弊端:
對(duì)應(yīng)的解決方案為:
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 插件都有。相關(guān)使用方法看字段名就可以知道仑氛。不如你也試試吧乙埃。
-?
原文:https://blog.csdn.net/xcl119xcl/article/details/89241388
版權(quán)聲明:本文為博主原創(chuàng)文章闸英,轉(zhuǎn)載請(qǐng)附上博文鏈接!