您好,登錄后才能下訂單哦!
摘要
此篇主要講Filter插件,已經(jīng)對(duì)nginx 日志的各種處理實(shí)例
接著上篇繼續(xù)說(shuō)插件
1,F(xiàn)ilter插件
Grok:正則捕獲
Date:時(shí)間處理
Mutate:數(shù)據(jù)修改
Geoip:查詢歸類
JSON:編解碼
Grok:解析和結(jié)構(gòu)化任何文本。
http://grokdebug.herokuapp.com/patterns# 匹配規(guī)則,注意空格,如果空格不匹配也會(huì)報(bào)錯(cuò)
http://grokdebug.herokuapp.com/ 匹配檢查,而且有語(yǔ)法提示
Grok 目前是logstash最好的方式對(duì)非結(jié)構(gòu)化日志數(shù)據(jù)解析成結(jié)構(gòu)化和可查詢化。logstash內(nèi)置了120個(gè)匹配模式,滿足大部分需求。
格式:
filter { grok { match => { "message" => "grok_pattern" } } }
注 :
grok_pattern由零個(gè)或多個(gè)%{SYNTAX:SEMANTIC}組成,其中SYNTAX是表達(dá)式的名字,是由grok提供的,例如數(shù)字表達(dá)式的名字是NUMBER,IP地址表達(dá)式的名字是IP。SEMANTIC表示解析出來(lái)的這個(gè)字符的名字,由自己定義,例如IP字段的名字可以是client。
簡(jiǎn)單例子:
#cat conf.d/test.conf input {stdin{}} #輸入方式為標(biāo)準(zhǔn)輸入 filter { grok { #grok插件匹配 #patterns_dir => "/path/to/patterns" #將匹配規(guī)則寫到指定文件方便管理 match => { "message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}" } #WORD匹配字符串,NUMBER匹配數(shù)值,支持int,float格式。匹配的值賦給request_time變量 #remove_field => ["message"] #處理結(jié)果刪除掉message字段 } } output { #輸出方式為標(biāo)準(zhǔn)輸出 stdout {codec=>rubydebug} #定義輸出格式為rubydebug }
結(jié)果:
# ./bin/logstash -f conf.d/test.conf Logstash startup completed begin 123.456 end { "message" => "begin 123.456 end", #remove之后就不顯示了。 "@version" => "1", "@timestamp" => "2016-05-09T02:43:47.952Z", "host" => "dev-online", "request_time" => 123.456 #grok匹配中新加的變量 }
Nginx 日志處理匹配:
因?yàn)閚ginx日志已經(jīng)被處理成json數(shù)據(jù),傳過(guò)來(lái)就是key:value的方式,打印成rubydebug格式如下:
所以現(xiàn)在想要篩選不要的字段
input { file { path => "/var/log/nginx/access.log" type => "json" codec => "json" start_position => "beginning" } } filter { grok { match => { "@timestamp" =>"%{WORD}" #先把不想要的字段匹配出來(lái) "type" => "%{WORD}" } remove_field => ["@timestamp","type"] #再移除字段 } } output { stdout { codec=>rubydebug } }
運(yùn)行結(jié)果:
nginx 日志json格式:
log_format json '{"@timestamp":"$time_iso8601",' '"@version":"1",' '"host":"$server_addr",' '"client":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"domain":"$host",' '"url":"$request",' '"refer":"$http_referer",' '"agent":"$http_user_agent",' '"status":"$status"}'; access_log /var/log/nginx/access.log json;
nginx配置文件常用正則匹配參數(shù)
nginx 日志格式 匹配項(xiàng)目 備注
$remote_addr %{IPORHOST:clientip}
$remote_user %{NOTSPACE:remote_user}
[$time_local] \[%{HTTPDATE:timestamp}\] “[]"需要屬于特殊字符需要轉(zhuǎn)義一下
"$request" "%{WORD:method} 訪問(wèn)請(qǐng)求,一般都加"",匹配時(shí)也加一下。 WORD匹配GET,POST
method %{URIPATHPARAM:request} URIPATHPARAM匹配請(qǐng)求的uri
HTTP %{NUMBER:httpversion}" NUMBER匹配數(shù)字,并賦值給httpversion http協(xié)議版本
$status %{NUMBER:status} NUMBER匹配數(shù)字,并賦值給status,作為返回狀態(tài)
$body_bytes_sent %{NUMBER:response} 內(nèi)容大小
"$http_referer" "%{QS:referrer}" 匹配請(qǐng)求refer
"$http_user_agent" "%{QS:agent}" 匹配親切agent
"$http_x_forwarded_for" "%{QS:xforwardedfor}" 匹配xfw
$upstream_addr %{IPV4:upstream}:%{POSINT:port}
$scheme %{WORD:scheme} 匹配http or https
eg: nginx日志格式:
log_format access '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
日志實(shí)例:
"192.168.1.22 - - [20/Apr/2016:16:28:14 +0800] "GET /ask/232323.html HTTP/1.1" 500 15534 "http://test.103.100xhs.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36""
匹配規(guī)則
"%{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} %{NUMBER:response} %{QS:referrer} %{QS:agent}"
Geoip地址查詢:
GeoIP 是最常見(jiàn)的免費(fèi) IP 地址歸類查詢庫(kù),GeoIP 庫(kù)可以根據(jù) IP地址提供對(duì)應(yīng)的地域信息,包括國(guó)別,省市,經(jīng)緯度等,對(duì)于可視化地圖和區(qū)域統(tǒng)計(jì)非常有用
input { stdin{} } filter { geoip { source => "message" #source必須為公網(wǎng)ip 否則geoip不會(huì)顯示數(shù)據(jù) # fields => ["city_name","country_code2","country_name","latitude","longitude"] } #geoip輸出的內(nèi)容比較多,可以指定輸出的列 } output { stdout{ codec=>rubydebug } }
找到對(duì)應(yīng)IP的key 就是geoip 中source所指定的值。
完整的例子:
結(jié)果:
注意:geoip 插件的 "source" 字段可以是任一處理后的字段,比如 "client_ip",但是字段內(nèi)容卻需要
小心!geoip 庫(kù)內(nèi)只存有公共網(wǎng)絡(luò)上的 IP 信息,查詢不到結(jié)果的,會(huì)直接返回 null,
JSON:
input {stdin{}} filter { json { source => "message" #必選項(xiàng) } } output { stdout{ codec=>rubydebug } }
結(jié)果:
{"name":"wd","age":"15"} { "message" => "{\"name\":\"wd\",\"age\":\"15\"}", "@version" => "1", "@timestamp" => "2016-05-09T06:32:13.546Z", #加一個(gè)時(shí)間戳的好處是方便kibana導(dǎo)入 "host" => "dev-online", "name" => "wd", "age" => "15" }
Date事件處理
注意:因?yàn)樵谏院蟮?outputs/elasticsearch 中常用的 %{+YYYY.MM.dd} 這種寫法必須讀取 @timestamp 數(shù)據(jù),所以一定不要直接刪掉這個(gè)字段保留自己的字段,而是應(yīng)該用 filters/date 轉(zhuǎn)換后刪除自己的字段!
filter { grok { match => ["message", "%{HTTPDATE:logdate}"] } date { match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"] } }
注意:時(shí)區(qū)偏移量只需要用一個(gè)字母 Z 即可。
Mutate數(shù)據(jù)修改
1,類型轉(zhuǎn)換
可以設(shè)置的轉(zhuǎn)換類型包括:"integer","float" 和 "string"。示例如下
filter { mutate { convert => ["request_time", "float"] } }
注意:mutate 除了轉(zhuǎn)換簡(jiǎn)單的字符值,還支持對(duì)數(shù)組類型的字段進(jìn)行轉(zhuǎn)換,即將 ["1","2"] 轉(zhuǎn)換成 [1,2]。但不支持對(duì)哈希類型的字段做類似處理。有這方面需求的可以采用稍后講述的 filters/ruby 插件完成。
2,字符串處理
gsub 僅對(duì)字符串類型字段有效
gsub => ["urlparams", "[\\?#]", "_"]
split
split => ["message", "|"]
隨意輸入一串以|分割的字符,比如 "123|321|adfd|dfjld*=123",可以看到如下輸出:
join 僅對(duì)數(shù)組類型字段有效
我們?cè)谥耙呀?jīng)用 split 割切的基礎(chǔ)再 join 回去。配置改成:
join => ["message", ","]
merge合并兩個(gè)數(shù)組或者哈希字段。依然在之前 split 的基礎(chǔ)上繼續(xù):
merge => ["message", "message"]
rename 重命名某個(gè)字段,如果目的字段已經(jīng)存在,會(huì)被覆蓋掉:
rename => ["syslog_host", "host"]
update 更新某個(gè)字段的內(nèi)容。如果字段不存在,不會(huì)新建。
replace 作用和 update 類似,但是當(dāng)字段不存在的時(shí)候,它會(huì)起到 add_field 參數(shù)一樣的效果,自動(dòng)添加新的字段。
Codec編碼插件
json: 直接輸入預(yù)定義好的 JSON 數(shù)據(jù),這樣就可以省略掉 filter/grok 配置!
path => "/var/log/nginx/access.log_json""
codec => "json"
Multiline:合并多行數(shù)據(jù)
stdin { codec => multiline { pattern => "^\[" negate => true what => "previous" } }
終端輸入:以 the end 結(jié)束,換行無(wú)法結(jié)束。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。