1.grok
Description
Parse arbitrary text and structure it.
Grok is a great way to parse unstructured log data into something structured and queryable.
This tool is perfect for syslog logs, apache and other webserver logs, mysql logs, and in general, any log format that is generally written for humans and not computer consumption.
Logstash ships with about 120 patterns by default. You can find them here:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns. You can add your own trivially. (See the'patterns_dir'setting)
grok可以解析任意的文本并將其結(jié)構(gòu)化。
該工具在針對syslog, apache或者其他的webserver或者例如mysql跟其他一些雜七雜八的東西會特別好用=- =。而且對log的格式化僅僅是為了數(shù)據(jù)顯示更加人性化稠项,不會增加計(jì)算消耗焰坪。
Logstash本身針對不同語言有120種默認(rèn)的匹配模式(實(shí)際上很容易看到是正則表達(dá)式)包吝,你也可以寫你自己的表達(dá)式并且提一個pull request畦浓;
Grok Basics
Grok 通過將文本標(biāo)簽與log內(nèi)容進(jìn)行匹配實(shí)現(xiàn)格式化浦旱。
格式:%{SYNTAX:SEMANTIC}
SYNTAX是標(biāo)簽的名字直奋,SEMANTIC是通過標(biāo)簽映射得到的數(shù)據(jù)的存放變量能庆。
栗子
1234 55.3.244.1
可以匹配 %{NUMBER:IDKFKDATA} %{IP:clientaddr}
該匹配會將前一個數(shù)字存入名為“IDKFKDATA”的字段內(nèi),而后一個數(shù)據(jù)會被識別為IP地址并存入clientaddr字段脚线。
默認(rèn)情況下所有字段的存儲類型為String搁胆,如果你希望其他的存儲類型
%{NUMBER:num:int}使用這種匹配將產(chǎn)生int類型的字段
Examples: With that idea of a syntax and semantic, we can pull out useful fields from a sample log like this fictional http request log:
5.3.244.1 GET /index.html 15824 0.043
The pattern for this could be:
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
自定義過濾標(biāo)簽
(?<field_name>the pattern here)
直接用這個就能自定義一個正則把數(shù)據(jù)存入field_name.
也可以寫文件自定義一個pattern
一些選項(xiàng)
-
break_on_match
boolean默認(rèn)為true,設(shè)置匹配是否只進(jìn)行最初匹配到的,如果設(shè)置為false邮绿,每一次匹配都將執(zhí)行完所有的pattern渠旁,如果你為一個數(shù)據(jù)設(shè)置了多個pattern,需要設(shè)置為false船逮。 -
keep_empty_captures
默認(rèn)為false顾腊,如果沒能捕獲到數(shù)據(jù)將不會有空的字段產(chǎn)生 -
match
默認(rèn)值是用中括號"{}"括起來的鍵值對""field1"=>"value1"
Example:
match => {
"field1" => "value1"
"field2" => "value2"
...
}
最常用的就是對message字段進(jìn)行格式化
filter {
grok { match => { "message" => "Duration: %{NUMBER:duration}" } }
}
如果想對同一個字段多次格式化
filter {
grok { match => { "message" => [ "Duration: %{NUMBER:duration}", "Speed: %{NUMBER:speed}" ] } }
}
其中"Duration: "是正則直接匹配相對應(yīng)的字符,%{}是grok的匹配標(biāo)簽挖胃,前者為正則后者為字段
-
named_captures_only
boolean形式默認(rèn)值是true
只用通過grok標(biāo)簽成功匹配到并寫入字段的數(shù)據(jù)會被保存 -
overwrite
很奇怪的一個參數(shù)杂靶,可以覆寫已經(jīng)存在的標(biāo)簽梆惯,復(fù)寫的內(nèi)容可以是grok中過濾出來的字段(這里存在一個問題,我從已有的message字段中過濾出一個message然后用新的message字段覆寫伪煤,最后剩下幾個message)
試驗(yàn)部分 發(fā)送一個字段包含message="May 29 16:37:11 sadness logger: hello world"
調(diào)用filter { grok { match => { "message" => "%{SYSLOGBASE} %{DATA:message}" } overwrite => [ "message" ] } }
試驗(yàn)結(jié)果加袋,grok有作用 %{SYSLOGBASE}在linuxlog文件中書寫,成功得到對應(yīng)字段
但是%{DATA:message}匹配失敗
查詢發(fā)現(xiàn)DATA -> .*?加了問號導(dǎo)致非貪婪模式什么都沒有匹配到(garbage garbage garbage)不加override設(shè)置的效果是message字段變成了數(shù)組抱既,[0]是原來的message內(nèi)容,[1]职烧,存儲的是匹配出來的"hello world"
增加了override設(shè)置之后message字段只有"hello world"數(shù)據(jù)
順便測試了自定義匹配的可用性還是靠譜的。
-
pattern_definitions
emmm這個東西比較神奇防泵,值是hash鍵值對蚀之,用來定義自定義的匹配模式,但是實(shí)際上可以直接用噢能夠上文的自定義inline字符串替代捷泞。大概相當(dāng)于把自定義匹配模式的東西寫到配置中足删。 -
patterns_dir
前面提到pattern可以自己配置在文件中,通過配置這個屬性來讀取文件 锁右,值是array“[]”失受,可以同時讀取多個文件。 -
patterns_files_glob
一個字符串咏瑟,用正則過濾出要使用的匹配標(biāo)簽文件拂到。。
默認(rèn)是* -
tag_on_failure
默認(rèn)為"_grokparsefailure",當(dāng)匹配失敗后會增加一個該名字的字段告訴你grok工作錯誤 -
tag_on_timeout
類似于上面那個的功能 -
timout_millis
設(shè)置超時码泞,如果有多個pattern 那么超時針對每一個pattern單獨(dú)工作,超時不會過快觸發(fā)兄旬,但有時候會稍慢觸發(fā)。當(dāng)該值設(shè)置為0時不會超時余寥,默認(rèn)為30000(大概是毫秒领铐,具體沒說)
一些公共選項(xiàng)(后續(xù)不再重復(fù)介紹)
-
add_field
Example:
filter {
grok {
add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
}
}
沒錯很好用,每一款filter都可以加這個玩意兒
-
add_tag
增加一些tag
還需要探究一下跟空的add_field有什么區(qū)別
結(jié)果
區(qū)別還是比較大的宋舷,add_tag實(shí)際上是在tags字段下添加數(shù)據(jù)绪撵,不會新產(chǎn)生字段,而add_field可以產(chǎn)生新的字段
-
enable_metric
關(guān)閉或者打開公共日志記錄功能 肥缔,默認(rèn)Logstash為所有插件提供日志記錄莲兢,不過你可以手動關(guān)閉其中的一些你不要的。 -
id
這個id寫在日志中续膳,是一個字符串改艇,如果你不指定一個明確的id,logstash會給你生成一個坟岔,但是如果多次使用了同一種filter谒兄,那么一定要加一個id便以區(qū)分不同的同款過濾器. -
periodic_flush
通過有規(guī)律的時間間隔調(diào)用過濾插件的flush方法.= -= 目前不知道有沒有用,感覺問題不大社付,如果出現(xiàn)了數(shù)據(jù)不及時問題應(yīng)該設(shè)置為true承疲,默認(rèn)值是false -
remove_field
就這么用=- =
You can also remove multiple fields at once:
filter { grok { remove_field => [ "foo_%{somefield}", "my_extraneous_field" ] } }
字面意思邻耕,刪除某些字段
-
remove_tag
寫法同上,字面意思
值得注意的是某些標(biāo)簽的使用需要在過濾器成功工作的前提下燕鸽,如果你的標(biāo)簽沒有效果兄世,記得檢查一下前面的過濾主體(有的標(biāo)簽必須在有過濾得情況下才能起作用)
2.Aggregate
Description
The aim of this filter is to aggregate information available among several events (typically log lines) belonging to a same task, and finally push aggregated information into final task event.
You should be very careful to set Logstash filter workers to 1 (-w 1 flag) for this filter to work correctly otherwise events may be processed out of sequence and unexpected results will occur.
該過濾器的目的是將多條消息的數(shù)據(jù)聚合成一條消息,提供"code"字段可以對int屬性進(jìn)行自定義的增加減少啊研,然后丟到某一個最終消息中去御滩,然后進(jìn)入output過程。
不過為了使用這個過濾器党远,你需要將Logstash的過濾器參數(shù)設(shè)置為1 (-w 1 flag)這樣該過濾器才能正確工作削解。否則會掉頭發(fā)。
總的來說是一個很迷的過濾器沟娱,請盡量在來源或者Kibana中完成消息聚合氛驮, 使用該Filter極其麻煩。
拒絕翻譯這個東西 = =
3.Mutate
Description
The mutate filter allows you to perform general mutations on fields. You can rename, remove, replace, and >modify fields in your events.
變形(济似?)過濾器矫废。 允許你對字段做一般的改變。 你可以改名,刪除,替代,修改收到消息中的參數(shù)砰蠢。
如果你認(rèn)真讀了上面的你會發(fā)現(xiàn)grok也提供刪除字段的功能磷脯。實(shí)際上相當(dāng)多的過濾器提供了大量的重復(fù)功能,不過我認(rèn)為針對不同操作盡量調(diào)用相對應(yīng)的過濾器會令配置簡潔明了娩脾。
-
convert
轉(zhuǎn)換操作,將某個字段的值得類型轉(zhuǎn)換成其他類型打毛,例如將string字段轉(zhuǎn)化為integer字段柿赊,如果字段是一個數(shù)組,每一個元素將會被轉(zhuǎn)換幻枉,如果字段是一個hash(鍵值對)碰声,那么將不會有什么效果。
Example:
filter { mutate { convert => { "fieldname" => "integer" } } }
其中涉及到True False有一些轉(zhuǎn)換的規(guī)則熬甫,詳情請從title下面的英文文檔鏈接點(diǎn)進(jìn)去胰挑。(沒錯自己看吧hhhh)
-
copy
值為hash,將已經(jīng)存在的字段復(fù)制到另一個新的或者已經(jīng)存在的字段(覆蓋)椿肩。
Example:
filter { mutate { copy => { "source_field" => "dest_field" } } }
-
gsub
值為array,對某個字段為string或者是string的array的執(zhí)行正則表達(dá)式過濾操作瞻颂,并用全新的string替代這些被匹配到的字符串。
Example:
filter { mutate { gsub => [ # replace all forward slashes with underscore "fieldname", "/", "_", # replace backslashes, question marks, hashes, and minuses # with a dot "." "fieldname2", "[\\?#-]", "." ] } }
你會發(fā)現(xiàn)有兩個反斜杠郑象,這沒錯贡这,你需要給正則里面的所有反斜杠加反斜杠。厂榛。盖矫。我知道這有點(diǎn)繞口hhh丽惭。
-
join
把一個array用某一個分隔符連成一條
Example:
filter { mutate { join => { "fieldname" => "," } } }
-
lowercase
某些字段全部變成小寫……
Example:
filter { mutate { lowercase => [ "fieldname" ] } }
-
merge
hash
這個東西比較神奇,把兩個字段的東西merge在一起- 可以把string跟string的數(shù)組merge在一起
- 可以把string跟string merge在一起辈双,會變成一個string的數(shù)組
- 不可以把數(shù)組跟hash merge在一起
hash也可以merge
反正你自己玩=责掏。=
Example:
filter { mutate { merge => { "dest_field" => "added_field" } } }
-
rename
修改field的名字,值是哈西鍵值對 用{}括起來湃望。栗子就不放了沒什么意義换衬。 -
replace
用新的內(nèi)容替代字段內(nèi)的原本內(nèi)容。比較常用喜爷。
當(dāng)數(shù)據(jù)源不方便修改格式的時候可以直接在這里修改冗疮,當(dāng)然用grok也不錯,自己選擇檩帐。
Example:
filter { mutate { replace => { "message" => "%{source_host}: My new message" } } }
-
split
如果你有一個字符串的變量术幔,由某一種字符分隔,可以用這個進(jìn)行分割變成一個數(shù)組湃密。
比如用逗號分割一個字符串
mutate{
split => {"fieldname" => "," }
}
-
strip
從一個array的字段中刪除空格诅挑,只刪除單詞前后的空格 -
update
更新一個字段的值,經(jīng)過測試泛源,功能上跟replace沒有半毛錢區(qū)別拔妥,replace優(yōu)先級更高,當(dāng)replace跟update同時出現(xiàn)時达箍,最后結(jié)果為replace的值没龙。
只能作用于已經(jīng)存在的字段 -
uppercase
將字符串轉(zhuǎn)換為大寫
4.Date
Descriptionedit
The date filter is used for parsing dates from fields, and then using that date or timestamp as the logstash timestamp for the event.
For example, syslog events usually have timestamps like this:"Apr 17 09:32:01"
You would use the date format
MMM dd HH:mm:ss
to parse this.
The date filter is especially important for sorting events and for backfilling old data. If you don’t get the date correct in your event, then searching for them later will likely sort out of order.
In the absence of this filter, logstash will choose a timestamp based on the first time it sees the event (at input time), if the timestamp is not already set in the event. For example, with file input, the timestamp is set to the time of each read.
日期過濾器是一個用來解析日期格式的過濾器,并將解析出來的日期作為logstash的時間戳使用缎玫。
栗子
日期過濾器是一個對整理消息重新回填舊數(shù)據(jù)非常重要的過濾器硬纤。如果你沒有在你的消息中正確的獲取到時間,那么之后對他們的搜索很可能會失去順序赃磨。
如果沒有該過濾器并且時間中沒有設(shè)置時間戳筝家,logstash會根據(jù)他首次獲取到消息的時間設(shè)置時間戳,比如從文件中讀取消息邻辉,那么每次讀取的時間將會作為時間戳溪王。
Date Filter Configuration Options 日期過濾器配置選項(xiàng)
- locale
- match
- tag_on_failure
- target
- timezone