您好,登錄后才能下訂單哦!
摘要
此篇主要講Filter插件,已經對nginx 日志的各種處理實例
接著上篇繼續說插件
1,Filter插件
Grok:正則捕獲
Date:時間處理
Mutate:數據修改
Geoip:查詢歸類
JSON:編解碼
Grok:解析和結構化任何文本。
http://grokdebug.herokuapp.com/patterns# 匹配規則,注意空格,如果空格不匹配也會報錯
http://grokdebug.herokuapp.com/ 匹配檢查,而且有語法提示
Grok 目前是logstash最好的方式對非結構化日志數據解析成結構化和可查詢化。logstash內置了120個匹配模式,滿足大部分需求。
格式:
filter { grok { match => { "message" => "grok_pattern" } } }
注 :
grok_pattern由零個或多個%{SYNTAX:SEMANTIC}組成,其中SYNTAX是表達式的名字,是由grok提供的,例如數字表達式的名字是NUMBER,IP地址表達式的名字是IP。SEMANTIC表示解析出來的這個字符的名字,由自己定義,例如IP字段的名字可以是client。
簡單例子:
#cat conf.d/test.conf input {stdin{}} #輸入方式為標準輸入 filter { grok { #grok插件匹配 #patterns_dir => "/path/to/patterns" #將匹配規則寫到指定文件方便管理 match => { "message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}" } #WORD匹配字符串,NUMBER匹配數值,支持int,float格式。匹配的值賦給request_time變量 #remove_field => ["message"] #處理結果刪除掉message字段 } } output { #輸出方式為標準輸出 stdout {codec=>rubydebug} #定義輸出格式為rubydebug }
結果:
# ./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 日志處理匹配:
因為nginx日志已經被處理成json數據,傳過來就是key:value的方式,打印成rubydebug格式如下:
所以現在想要篩選不要的字段
input { file { path => "/var/log/nginx/access.log" type => "json" codec => "json" start_position => "beginning" } } filter { grok { match => { "@timestamp" =>"%{WORD}" #先把不想要的字段匹配出來 "type" => "%{WORD}" } remove_field => ["@timestamp","type"] #再移除字段 } } output { stdout { codec=>rubydebug } }
運行結果:
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配置文件常用正則匹配參數
nginx 日志格式 匹配項目 備注
$remote_addr %{IPORHOST:clientip}
$remote_user %{NOTSPACE:remote_user}
[$time_local] \[%{HTTPDATE:timestamp}\] “[]"需要屬于特殊字符需要轉義一下
"$request" "%{WORD:method} 訪問請求,一般都加"",匹配時也加一下。 WORD匹配GET,POST
method %{URIPATHPARAM:request} URIPATHPARAM匹配請求的uri
HTTP %{NUMBER:httpversion}" NUMBER匹配數字,并賦值給httpversion http協議版本
$status %{NUMBER:status} NUMBER匹配數字,并賦值給status,作為返回狀態
$body_bytes_sent %{NUMBER:response} 內容大小
"$http_referer" "%{QS:referrer}" 匹配請求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"';
日志實例:
"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""
匹配規則
"%{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} %{NUMBER:response} %{QS:referrer} %{QS:agent}"
Geoip地址查詢:
GeoIP 是最常見的免費 IP 地址歸類查詢庫,GeoIP 庫可以根據 IP地址提供對應的地域信息,包括國別,省市,經緯度等,對于可視化地圖和區域統計非常有用
input { stdin{} } filter { geoip { source => "message" #source必須為公網ip 否則geoip不會顯示數據 # fields => ["city_name","country_code2","country_name","latitude","longitude"] } #geoip輸出的內容比較多,可以指定輸出的列 } output { stdout{ codec=>rubydebug } }
找到對應IP的key 就是geoip 中source所指定的值。
完整的例子:
結果:
注意:geoip 插件的 "source" 字段可以是任一處理后的字段,比如 "client_ip",但是字段內容卻需要
小心!geoip 庫內只存有公共網絡上的 IP 信息,查詢不到結果的,會直接返回 null,
JSON:
input {stdin{}} filter { json { source => "message" #必選項 } } output { stdout{ codec=>rubydebug } }
結果:
{"name":"wd","age":"15"} { "message" => "{\"name\":\"wd\",\"age\":\"15\"}", "@version" => "1", "@timestamp" => "2016-05-09T06:32:13.546Z", #加一個時間戳的好處是方便kibana導入 "host" => "dev-online", "name" => "wd", "age" => "15" }
Date事件處理
注意:因為在稍后的 outputs/elasticsearch 中常用的 %{+YYYY.MM.dd} 這種寫法必須讀取 @timestamp 數據,所以一定不要直接刪掉這個字段保留自己的字段,而是應該用 filters/date 轉換后刪除自己的字段!
filter { grok { match => ["message", "%{HTTPDATE:logdate}"] } date { match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"] } }
注意:時區偏移量只需要用一個字母 Z 即可。
Mutate數據修改
1,類型轉換
可以設置的轉換類型包括:"integer","float" 和 "string"。示例如下
filter { mutate { convert => ["request_time", "float"] } }
注意:mutate 除了轉換簡單的字符值,還支持對數組類型的字段進行轉換,即將 ["1","2"] 轉換成 [1,2]。但不支持對哈希類型的字段做類似處理。有這方面需求的可以采用稍后講述的 filters/ruby 插件完成。
2,字符串處理
gsub 僅對字符串類型字段有效
gsub => ["urlparams", "[\\?#]", "_"]
split
split => ["message", "|"]
隨意輸入一串以|分割的字符,比如 "123|321|adfd|dfjld*=123",可以看到如下輸出:
join 僅對數組類型字段有效
我們在之前已經用 split 割切的基礎再 join 回去。配置改成:
join => ["message", ","]
merge合并兩個數組或者哈希字段。依然在之前 split 的基礎上繼續:
merge => ["message", "message"]
rename 重命名某個字段,如果目的字段已經存在,會被覆蓋掉:
rename => ["syslog_host", "host"]
update 更新某個字段的內容。如果字段不存在,不會新建。
replace 作用和 update 類似,但是當字段不存在的時候,它會起到 add_field 參數一樣的效果,自動添加新的字段。
Codec編碼插件
json: 直接輸入預定義好的 JSON 數據,這樣就可以省略掉 filter/grok 配置!
path => "/var/log/nginx/access.log_json""
codec => "json"
Multiline:合并多行數據
stdin { codec => multiline { pattern => "^\[" negate => true what => "previous" } }
終端輸入:以 the end 結束,換行無法結束。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。