1. 程式人生 > >ELK中logstash下的grok正則表示式總結

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

”,Unix平臺為“\n 
#%d 
輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式 
#
如:%d{yyyy年MM月dd日HH:mm:ss,SSS},輸出類似:20120105 22:10:28,921 
#%l 
輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數 
#
如:Testlog.main(TestLog.java:10) 
#%F 
輸出日誌訊息產生時所在的檔名稱 
#%L 
輸出程式碼中的行號 
#%x 
輸出和當前執行緒相關聯的NDC(巢狀診斷環境),javaservlets多客戶多執行緒的應用中 
#%% 
輸出一個"%"字元 
# 
可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文字的對齊方式。如:
 
#%5c: 
輸出category名稱,最小寬度是5category<5,預設的情況下右對齊 
#%-5c:
輸出category名稱,最小寬度是5category<5"-"號指定左對齊,會有空格 
#%.5c:
輸出category名稱,最大寬度是5category>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}