ELK中logstash下的grok正則表示式總結
首先,我的web專案列印的日誌是這樣的:
2016-11-30 11:10:44,568 INFO [org.springframework.web.servlet.DispatcherServlet] - <FrameworkServlet 'XXX': initialization completed in 1674 ms>
這樣的格式是由於我使用的是log4j.properties配置的是
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] -<%m>%n
這裡怎麼配置格式,可以檢視:
--------------=====================================-----------------------------------
#Log4J採用類似C語言中的printf函式的列印格式格式化日誌資訊,列印引數如下:
#%m 輸出程式碼中指定的訊息
#%p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
#%c 輸出所屬的類目,通常就是所在類的全名
#%t 輸出產生該日誌事件的執行緒名
#%n 輸出一個回車換行符,Windows平臺為“\r\n
#%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式
#如:%d{yyyy年MM月dd日HH:mm:ss,SSS},輸出類似:2012年01月05日 22:10:28,921
#%l 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數
#如:Testlog.main(TestLog.java:10)
#%F 輸出日誌訊息產生時所在的檔名稱
#%L 輸出程式碼中的行號
#%x 輸出和當前執行緒相關聯的NDC(巢狀診斷環境),像javaservlets多客戶多執行緒的應用中
#%% 輸出一個"%"字元
#
# 可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文字的對齊方式。如:
#%5c: 輸出category名稱,最小寬度是5,category<5,預設的情況下右對齊
#%-5c:輸出category名稱,最小寬度是5,category<5,"-"號指定左對齊,會有空格
#%.5c:輸出category名稱,最大寬度是5,category>5,就會將左邊多出的字元截掉,<5不會有空格
#%20.30c:category名稱<20補空格,並且右對齊,>30字元,就從左邊交遠銷出的字元截掉
-----------------=======================================------------------------------------
這個是基本的,自己配置好,注意其中的%m才是我們的重點,因為這個m代表的日誌是我們自己打印出來的想要
獲取的資訊,我在上一篇中講了怎麼配,需要的盆友可以看
http://blog.csdn.net/shunzi1046/article/details/53379779
然後這裡我再次修改,我的log4j.properties中是這樣的:
log4j.appender.stdout.layout.ConversionPattern=%d %p %m%n
並且,我的日誌輸出類中拼湊的格式是這樣的:
logger.info(ip+"/"+username +"/" + method +"/" + requestUrl)
所以最後打印出來的日誌是這樣的:
2016-12-01 11:18:05,550 INFO 127.0.0.1/zhangsan/GET/http://127.0.0.1:8080/xxxx/xxxx.html?xxxx
這裡的資訊都是我需要的 ,時間-日誌級別-IP-使用者名稱-method-請求url,
然後我就要配置我的logstash/conf/下面的test.conf檔案:
input {
log4j{
type => "log4j-json"
port => 4567
}
}
filter {
grok{
match => { "message" => "%{IP:client}/%{USER:auth}/%{WORD:method}/%{NOTSPACE:request}"}
}
}
output {
elasticsearch {
hosts => ["172.00.00.25:9200"]
index => "logstash-%{+yyyy.MM.dd}"
}
}
這樣要注意了,對於grok的匹配,一定要先在http://grokdebug.herokuapp.com/ 上面匹配成功了再拿來用,否則麻煩
到淚崩,然後要注意的是,我這裡是從IP先開始匹配的,因為IP是我的%m中的第一項,明白了吧,不是從%d開始匹配的!都是血和淚啊,
不過這裡還是說明一下全部parse的grok語句:
%{TIMESTAMP_ISO8601:date}\s%{LOGLEVEL:loglevel}\s%{IP:client}/%{USER:auth}/%{WORD:method}/%{NOTSPACE:request}
-----------------------------
然後依次執行Elasticsearch ,logstash ,kibana,進入http://伺服器Ip:5601下面,可以看到我自己拼湊的欄位(filed)已經能看到了,但是上面有黃色小三角警告,進入Setting重新整理filed就匯入進來了,然後就可以正常使用了,我就是摔倒在
grok裡啊,現在正在研究unique field的使用,一個人琢磨出來的經驗,好痛苦,有盆友需要可以給我留言,知無不言言無不盡!
======================================================================
最後留點參照的grok格式:
2016-05-21T09:53:25.687134+08:00 localhost [audit root/13558 as root/13558 on pts/0/172.16.100.99:50897->10.10.10.6:22]
%{TIMESTAMP_ISO8601:timestamp} %{IPORHOST:login_host} \[\S+ %{USER:login_user}/%{NUMBER:pid} as %{USER:sudouser}/%{NUMBER:sudouser_pid} on %{WORD:tty}/%{NUMBER:tty_id}/%{IPORHOST:host_ip}:%{NUMBER:source_port}-\>%{IPORHOST:local_ip}:%{NUMBER:dest_port}\]
-----------------------------------------------------------------------------
10.2.21.130 - - [08/Apr/2013:11:13:40 +0800] "GET /mediawiki/load.php HTTP/1.1" 304 - "http://som.d.xiaonei.com/mediawiki/index.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.28.10 (KHTML, like Gecko) Version/6.0.3
Safari/536.28.10"
grok{
match => { "message" => "%{IPORHOST:clientip}
%{USER:ident}
%{USER:auth}
\[%{HTTPDATE:timestamp}\]
\"(?:%{WORD:verb} %{URIPATHPARAM:request}(?: HTTP/%{NUMBER:httpversion})?|-)\"
%{NUMBER:response} (?:%{NUMBER:bytes}|-) %{NUMBER:responsetime}
\"(?:%{URI:referrer}|-)\" " }
}
------------------------------------------------------------------------
55.3.244.1 GET /index.html 15824 0.043(耗時s)
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
------------------------------------------------------------------
如下 Grok 常用的表示式解析日誌:
%{IPORHOST:clientip} %{NOTSPACE:identd} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] %{WORD:http_method} %{NOTSPACE:request} %{NOTSPACE:request_query|-} %{NUMBER:port} %{NUMBER:statusCode} (%{NOTSPACE:bytes}|-) %{NUMBER:reqTime} %{QS:referer} %{QS:userAgent}