你真的了解Grok嗎

在日志處理的過程中严肪,有一項(xiàng)非常常見的任務(wù)就是把原始的單行日志轉(zhuǎn)換成結(jié)構(gòu)化的日志秸架。如果你使用了ELK梦染,那么你可以利用ES對(duì)數(shù)據(jù)進(jìn)行聚合索赏,使用Kibana來進(jìn)行數(shù)據(jù)可視化從日志中來發(fā)現(xiàn)一些有價(jià)值的信息侵贵。

在LogStash中届搁,這項(xiàng)工作是由logstash-filter-grok來完成的,它有超過200個(gè)可用的窍育,大家都認(rèn)為是比較有用的Grok模式卡睦,例如IPv6地址、UNIX路徑等等蔫骂。

下面是一個(gè)示例日志

2016-09-19T18:19:00 [8.8.8.8:prd] DEBUG this is an example log message

使用Grok庫么翰,我們可以很容易的就完成日志格式化提取的任務(wù)

%{TIMESTAMP_ISO8601:timestamp} \[%{IPV4:ip};%{WORD:environment}\] %{LOGLEVEL:log_level} %{GREEDYDATA:message}

提取后的數(shù)據(jù)格式如下

{
  "timestamp": "2016-09-19T18:19:00",
  "ip": "8.8.8.8",
  "environment": "prd",
  "log_level": "DEBUG",
  "message": "this is an example log message"
}

看起來這是一件非常簡單的事情,好吧辽旋。浩嫌。那這篇文章就這樣寫完了么,當(dāng)然不是补胚。码耐。

為什么我的Grok使用起來非常的慢

這是一個(gè)非常常見的問題。性能這個(gè)問題通常都是要被拿出來討論的溶其,用戶通常會(huì)發(fā)現(xiàn)使用了Grok表達(dá)式之后骚腥,LogStash處理日志的速度變得很慢。就像前面所說的一樣瓶逃,Grok模式是基于正則表達(dá)式的束铭,所以這個(gè)插件在性能上已經(jīng)對(duì)正則做了非常多的性能優(yōu)化的了廓块。接下來的章節(jié),我們會(huì)討論在使用Grok模式中需要注意的點(diǎn)

多做些性能測(cè)試

在設(shè)計(jì)Grok表達(dá)式的時(shí)候契沫,我們需要一些方法來測(cè)試究竟哪種寫法性能表現(xiàn)更好带猴。出于這個(gè)原因,我些了個(gè)很小的jruby腳步用于測(cè)試Grok插件處理我所寫的Grok模式的性能懈万,你可以在這里獲取到這個(gè)腳本

留意grok匹配失敗的時(shí)候?qū)π阅艿挠绊?/h1>

盡管Grok匹配的性能是非常重要的拴清,但是匹配失敗的時(shí)候?qū)π阅艿挠绊懸彩俏覀冃枰粢獾摹.?dāng)grok匹配失敗的時(shí)候会通,插件會(huì)為這個(gè)事件打個(gè)tag口予,默認(rèn)是_grokparsefailure。LogStash允許你把這些處理失敗的事件路由到其他地方做后續(xù)的處理涕侈,例如

input { # ... }
filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{IPV4:ip};%{WORD:environment}\] %{LOGLEVEL:log_level} %{GREEDYDATA:message}" }
  }
}
output {
  if "_grokparsefailure" in [tags] {
    # write events that didn't match to a file
    file { "path" => "/tmp/grok_failures.txt" }
  } else {
     elasticsearch { }
  }
}

這樣的話我們就可以對(duì)這些處理失敗的事件做性能基準(zhǔn)測(cè)試了沪停。

現(xiàn)在,我們要開始對(duì)Apache的日志進(jìn)行格式化處理了

220.181.108.96 - - [13/Jun/2015:21:14:28 +0000] "GET /blog/geekery/xvfb-firefox.html HTTP/1.1" 200 10975 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

然后我們使用下面的Grok模式去進(jìn)行格式化提取

%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}

然后我們使用三種示例日志去測(cè)試這個(gè)Grok的性能驾凶,和Grok不匹配的日志分別出現(xiàn)在開始牙甫,中間和結(jié)束的位置

# beginning mismatch - doesn't start with an IPORHOST
'tash-scale11x/css/fonts/Roboto-Regular.ttf HTTP/1.1" 200 41820 "http://semicomplete.com/presentations/logs'

# middle mismatch - instead of an HTTP verb like GET or PUT there's the number 111
'220.181.108.96 - - [13/Jun/2015:21:14:28 +0000] "111 /blog/geekery/xvfb-firefox.html HTTP/1.1" 200 10975 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"'

# end mismatch - the last element isn't a quoted string, but a number
'220.181.108.96 - - [13/Jun/2015:21:14:28 +0000] "GET /blog/geekery/xvfb-firefox.html HTTP/1.1" 200 10975 "-" 1'

下面是性能測(cè)試的結(jié)果

Paste_Image.png

基于上面這個(gè)測(cè)試結(jié)果,我們可以發(fā)現(xiàn)调违,Grok的性能和不匹配的日志所出現(xiàn)的位置有關(guān)窟哺,最快與最慢的性能差了差不多6倍。這就能解釋為什么有用戶提出當(dāng)Grok匹配日志失敗的時(shí)候CPU會(huì)被吃滿的原因了技肩,例如這個(gè)issues
https://github.com/logstash-plugins/logstash-filter-grok/issues/37.

我們能做些什么呢

快速失敗且轨,設(shè)置錨點(diǎn)

我們已經(jīng)知道了處理失敗對(duì)grok的性能影響是非常大的,所以我們需要解決這個(gè)問題虚婿。對(duì)于正則引擎來說旋奢,你需要做的最合適的事情就是減少正則表達(dá)式所需要的猜測(cè)。這就是為什么貪婪匹配最好少用的原因然痊,那回到這個(gè)問題至朗,有沒一種更好的方法來調(diào)整這個(gè)Grok模式呢,讓我們重新來看看這行Apache的日志

220.181.108.96 - - [13/Jun/2015:21:14:28 +0000] "GET /blog/geekery/xvfb-firefox.html HTTP/1.1" 200 10975 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

剛才我們使用的Grok模式是這樣的

%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}

由于用戶以為Grok表達(dá)式只會(huì)從開頭匹配到結(jié)束剧浸,所以導(dǎo)致了在一些普通的場(chǎng)景下也會(huì)出現(xiàn)性能問題锹引。但是實(shí)際上,Grok只是被告知“在這段文本中尋找匹配的內(nèi)容”唆香,這就意味著下面這種示例也會(huì)被Grok所匹配嫌变。。躬它。

OMG OMG OMG EXTRA INFORMATION 220.181.108.96 - - [13/Jun/2015:21:14:28 +0000] "GET /blog/geekery/xvfb-firefox.html HTTP/1.1" 200 10975 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" OH LOOK EVEN MORE STUFF

呃腾啥。。這都行,不過解決這個(gè)問題還是很簡單的倘待,我們加一些錨點(diǎn)就搞定了疮跑。錨點(diǎn)可以讓你再一個(gè)指定的位置處理字符串。加入了開始和結(jié)束的錨點(diǎn)之后(^和$)延柠,Grok就會(huì)從開頭處理日志到結(jié)束了祸挪。這對(duì)處理那些不能匹配的日志有非常重要的作用。假如我們沒有假如錨點(diǎn)贞间,當(dāng)正則無法匹配這行日志的時(shí)候,它就會(huì)開始從子字符串中進(jìn)行匹配雹仿,然后性能就會(huì)下降增热,接下來我們把錨點(diǎn)加上,然后再做一次測(cè)試

^%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}$
Paste_Image.png

可以看到性能有了很大的提升胧辽,在一開始就匹配失敗的場(chǎng)景中峻仇,性能提升了將近10倍

留意匹配了兩次的表達(dá)式

你可能會(huì)說,“好吧邑商,我的日志都是能匹配通過的摄咆,沒有上面的問題”,但是事情可能并不是這樣的

我們看到過非常多的grok模式在處理同一個(gè)網(wǎng)關(guān)發(fā)出的多種應(yīng)用日志時(shí)候所出現(xiàn)的問題人断,例如syslog吭从。想象一下這樣一個(gè)場(chǎng)景,我們使用了“common_header: payload“這種日志格式來記錄了三種應(yīng)用日志

Application 1: '8.8.8.8 process-name[666]: a b 1 2 a lot of text at the end'
Application 2: '8.8.8.8 process-name[667]: a 1 2 3 a lot of text near the end;4'
Application 3: '8.8.8.8 process-name[421]: a completely different format | 1111'

通常我們會(huì)在一個(gè)Grok里面就把三種日志都處理掉

grok {
  "match" => { "message => [
    '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{WORD:word_1} %{WORD:word_2} %{NUMBER:number_1} %{NUMBER:number_2} %{DATA:data}',
    '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{WORD:word_1} %{NUMBER:number_1} %{NUMBER:number_2} %{NUMBER:number_3} %{DATA:data};%{NUMBER:number_4}',
    '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{DATA:data} | %{NUMBER:number}'
    ] }
}

值得留意的是即使你的日志是能正常匹配的恶迈,Grok還是會(huì)按照順序許匹配送進(jìn)來的日志涩金,當(dāng)碰到第一個(gè)匹配成功的日志就break掉這個(gè)循環(huán)。這就要我們自己去判斷一下暇仲,怎么放是最合適的了步做,不然的話會(huì)一個(gè)一個(gè)往下進(jìn)行嘗試,畢竟是多種不同的格式奈附。
一種常用的優(yōu)化方案是使用分層匹配來對(duì)這個(gè)Grok進(jìn)行優(yōu)化

filter {
  grok {
    "match" => { "message" => '%{IPORHOST:clientip} %{DATA:process_name}\[%{NUMBER:process_id}\]: %{GREEDYDATA:message}' },
    "overwrite" => "message"
  }
  grok {
    "match" => { "message" => [
      '%{WORD:word_1} %{WORD:word_2} %{NUMBER:number_1} %{NUMBER:number_2} %{GREEDYDATA:data}',
      '%{WORD:word_1} %{NUMBER:number_1} %{NUMBER:number_2} %{NUMBER:number_3} %{DATA:data};%{NUMBER:number_4}',
      '%{DATA:data} | %{NUMBER:number}'
    ] }
  }
)

這是兩種匹配方案的性能測(cè)試結(jié)果

Paste_Image.png

看起來真有意思全度。。使用錨點(diǎn)的話斥滤,無論哪種方案性能都是一樣的将鸵。不用錨點(diǎn)的情況下分層Grok的方案比不分層的又快很多

那我們?cè)趺粗牢覀兯鶆?chuàng)建的Grok是合適的

我們已經(jīng)得出了對(duì)_grokparsefaiure進(jìn)行處理的必要性了,那么我們還能做什么呢中跌?
從3.2.0這個(gè)Grok插件開始咨堤,它有一些參數(shù)可以幫助你了解為什么一個(gè)事件會(huì)被處理那么久了。使用timeout_millistag_on_timeout可以設(shè)置Grok匹配的最大處理時(shí)長漩符。如果超時(shí)了一喘,這個(gè)事件會(huì)被打上_groktimeout的tag,然后我們就可以把他們送到一個(gè)Grok處理失敗的ES索引里面去做后續(xù)的分析了

另外一個(gè)很棒的方法是LogStash5.0帶了插件性能統(tǒng)計(jì)的功能,我們可以通過API來查看插件處理日志的性能了

$ curl localhost:9600/_node/stats/pipeline?pretty | jq ".pipeline.plugins.filters"
[
  {
    "id": "grok_b61938f3833f9f89360b5fba6472be0ad51c3606-2",
    "events": {
      "duration_in_millis": 7,
      "in": 24,
      "out": 24
    },
    "failures": 24,
    "patterns_per_field": {
      "message": 1
    },
    "name": "grok"
  },
  {
    "id": "kv_b61938f3833f9f89360b5fba6472be0ad51c3606-3",
    "events": {
      "duration_in_millis": 2,
      "in": 24,
      "out": 24
    },
    "name": "kv"
  }
]

然后我們就可以通過duration_in_millis來判斷一個(gè)插件的性能了

總結(jié)

希望這篇文章能幫你了解為什么Grok的性能會(huì)變得慢和如何去提升他的性能凸克。下面是對(duì)這篇文字的總結(jié):

  • Grok在匹配失敗的時(shí)候性能可能并不那么好
  • 多留意_grokparsefailures出現(xiàn)的頻率和出現(xiàn)時(shí)候的性能
  • 寫正則的時(shí)候記得打錨點(diǎn)
  • 不使用錨點(diǎn)的時(shí)候分層Grok處理的性能會(huì)比不分層的性能好议蟆,不過打了錨點(diǎn)的話兩個(gè)都一樣
  • 多使用LogStash的性能監(jiān)控功能,后續(xù)還可以拿來分析用

原文:https://www.elastic.co/blog/do-you-grok-grok

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萎战,一起剝皮案震驚了整個(gè)濱河市咐容,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚂维,老刑警劉巖戳粒,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虫啥,居然都是意外死亡蔚约,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門涂籽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苹祟,“玉大人,你說我怎么就攤上這事评雌∈鞣悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵景东,是天一觀的道長砂轻。 經(jīng)常有香客問我,道長耐薯,這世上最難降的妖魔是什么舔清? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮曲初,結(jié)果婚禮上体谒,老公的妹妹穿的比我還像新娘。我一直安慰自己臼婆,他們只是感情好抒痒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颁褂,像睡著了一般故响。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颁独,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天彩届,我揣著相機(jī)與錄音,去河邊找鬼誓酒。 笑死樟蠕,一個(gè)胖子當(dāng)著我的面吹牛贮聂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寨辩,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吓懈,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了靡狞?” 一聲冷哼從身側(cè)響起耻警,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甸怕,沒想到半個(gè)月后甘穿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梢杭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年扒磁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磕诊,死狀恐怖爷贫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尿背,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站钧排,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏均澳。R本人自食惡果不足惜恨溜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望找前。 院中可真熱鬧糟袁,春花似錦、人聲如沸躺盛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槽惫。三九已至周叮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間界斜,已是汗流浹背仿耽。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留各薇,地道東北人项贺。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敬扛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晰洒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)啥箭,斷路器谍珊,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • 讀大學(xué)時(shí)砌滞,我們的校報(bào)總編,是我們這些學(xué)生記者最喜歡的老師坏怪,也是我們學(xué)校知名度很高的人贝润。他長得很有特色,清瘦铝宵,戴眼鏡...
    七默七默閱讀 365評(píng)論 2 1
  • 游于藝顧文豪刊于2010年4月3日《新京報(bào)》 在云南麗江古城打掘,離四方街不遠(yuǎn)的木府前,立著一座石牌坊鹏秋,上有四個(gè)大字“...
    茸小呆閱讀 2,366評(píng)論 0 1
  • 姓名:徐程程 公司.:海通食品集團(tuán)有限公司 組別: 340期【反省一組】學(xué)員 【知~學(xué)習(xí)】 背誦《六項(xiàng)精進(jìn)大綱》1...
    ting8596閱讀 199評(píng)論 0 0