preface
說道分析日志,我們知道的采集方式有2種:
- 通過grok在logstash的filter里面過濾匹配。
- logstash --> redis --> python(py腳本過濾匹配) --> ES
第一種方式是不怎么推薦使用的,除非是在日志量比較小的場景才推薦使用。因為grok非常影響性能的,且不夠靈活,除非你很懂ruby。
第二種方式是 我們一直推薦使用的架構,講究松耦合關系。
下面我們還是說說第一種方式,然后再說第二種方式。
grok模塊是作用在filter里面的,它是個可以分析任意文本內容和重構內容的模塊。它是當前最好的模塊在logstash上處理糟糕,亂序的日志數據,可以把這些數據分析成有序,可查詢的。並且,它可以很好的處理syslog,apache 和其他的webserver,mysql logs等日志。通常來說,對於我們使用者(不是計算機,是人類)來說,任何日志格式都可以被寫入的。
所以這里我們讓grok結合apache的日志做分析。
apache默認日志格式:
我們打開apache的日志配置選項,可以看到
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
參數解釋:
- %h: 這是發送請求到服務器的客戶的IP地址
- %l: 這是由客戶端identd進程判斷的RFC1413身份(identity),輸出中的符號"-"表示此處的信息無效
- %u: 這是HTTP認證系統得到的訪問該網頁的客戶標識(userid),環境變量REMOTE_USER會被設為該值並提供給CGI腳本。如果狀態碼是401,表示客戶未通過認證,則此值沒有意義。如果網頁沒有設置密碼保護,則此項將是"-"。
- %t:這是服務器完成請求處理時的時間,其格式是:
[日/月/年:時:分:秒 時區]
日 = 2數字
月 = 3字母
年 = 4數字
時 = 2數字
分 = 2數字
秒 = 2數字
時區 = (+|-)4數字 - "%r": 引號中是客戶端發出的包含許多有用信息的請求行
- %>s: 這是服務器返回給客戶端的狀態碼。
- %b: 最后這項是返回給客戶端的不包括響應頭的字節數。如果沒有信息返回,則此項應該是"-",如果希望記錄為"0"的形式,就應該用%B 。
更多資料,可以參考:http://www.jinbuguo.com/apache/menu22/logs.html
grok模塊使用--拿個例子熱熱身
下面看看grok的使用,可以參考官網地址:https://www.elastic.co/guide/en/logstash/2.3/plugins-filters-grok.html#plugins-filters-grok
logstash的一些核心模塊在這里面:/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns
我們參考官網的例子來做下:
首先配置logstash。
[root@linux-node1 conf.d]# cat apache.conf
input {
stdin {
}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } # 這些IP,WORD等等都是logstash內部設定好的匹配。
}
}
output{
stdout {
codec => rubydebug
}
}
確認無誤后啟動,輸入一列信息:
[root@linux-node1 conf.d]# /opt/logstash/bin/logstash -f apache.conf
Settings: Default pipeline workers: 2
Pipeline main started
55.3.244.1 GET /index.html 15824 0.043
{
"message" => "55.3.244.1 GET /index.html 15824 0.043",
"@version" => "1",
"@timestamp" => "2016-12-11T04:36:26.387Z",
"host" => "linux-node1",
"client" => "55.3.244.1",
"method" => "GET",
"request" => "/index.html",
"bytes" => "15824",
"duration" => "0.043"
}
上面可得,logstash是正常工作的,filter里面能夠識別對應的信息。下面就開始真正分析apache的日志。
分析apapche的日志
我們使用logstash自帶的apache日志分析模塊來使用,模塊位於這下面:
[root@linux-node1 conf.d]# vim /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
''''''
93 COMMONAPACHELOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpvers ion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) # 第93行
94 COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent} # 第94行
''''''
這個文件里有很多模塊可以使用,可以根據自己的需求來調用。
根據上面提供的模塊,我們可以直接配置在logstash里面,如下所示:
[root@linux-node1 conf.d]# cat /etc/logstash/conf.d/apache.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"} # 調用剛才找到的模塊
}
}
output{
stdout {
codec => rubydebug
}
}
確認配置沒有問題,那么就啟動logstash
[root@linux-node1 conf.d]# /opt/logstash/bin/logstash -f /etc/logstash/conf.d/apache.conf
此時我們可以在head上看到apache的日志索引了。。。然后老套路,在kibana里面創建索引就可了。