首先是安裝elasticsearch,這個很簡單:php
brew install elasticsearch
可是這裏就遇到了問題,個人java是1.6的,而elasticsearch須要1.7如下版本,因此還須要安裝java 1.7而要安裝java 1.7,用簡單的brew又不行,還須要先安裝cask,因此最後的步驟就變成了這樣:css
brew install brew-cask brew update brew cask install caskroom/versions/java7 java -version
能夠看到java版本已是1.7了。接下來:java
brew install elasticsearch elasticsearch --version
證實elasticsearch已經安裝好了。之後要啓動或者中止elasticsearch服務就執行如下命令:nginx
brew services start elasticsearch brew services stop elasticsearch
下面安裝logstash:sql
brew install logstash logstash --version
logstash已經安裝好了。而後安裝kibana,kibana的安裝不用brew,直接下載解壓以後,進到解壓目錄裏:apache
./kibana
接下來是配置logstash,在這裏我遇到了大麻煩。從頭提及,先要創建一個logstash的conf文件,以便於後期調試:ruby
mkdir logstash cd logstash
生成一個logstash.conf文件,在這裏咱們準備處理apache的log網絡
input {
file {
path => "/private/var/log/apache2/www.myserver.com-access_log" start_position => beginning ignore_older => 0 sincedb_path => "/dev/null" } } filter { grok { match => { "message" => "%{IPORHOST:clientip} - %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-)"} } date { match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss +0800" ] } } output { elasticsearch {} stdout {} }
爲了這個配置文件,費了很大精力,網上不少教程都和個人實際狀況不相符合。關鍵點說明以下:start_position => beginning
告訴logstash從個人log文件的頭部開始往下找,不要從半中間開始。ignore_older => 0
告訴logstash不要管個人log有多古老,一概處理,不然logstash缺省會從今天開始,就無論老日誌了。sincedb_path => "/dev/null"
這句話也很關鍵,特別是當你須要反覆調試的時候,由於logstash會記住它上次處理到哪兒了,若是沒有這句話的話,你再想處理同一個log文件就麻煩了,logstash會拒絕處理。如今有了這句話,就是強迫logstash忘記它上次處理的結果,從頭再開始處理一遍。
filter下面的grok裏面的match,網上教程通常是這麼寫的:app
match => { "message" => "%{COMBINEDAPACHELOG}" }
可是當我這麼寫的時候,老是處理不了個人log,個人log其實就長這個樣子:curl
127.0.0.1 - - [02/May/2016:22:11:28 +0800] "GET /assets/aa927304/css/font-awesome.min.css HTTP/1.1" 200 27466
查源代碼,官方是這麼寫的:
COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}
後面的combined引用前面的common,而問題就出在這個USER:ident
上。
我在https://grokdebug.herokuapp.com/反覆驗證,最後發現只要把這個USER:ident
改爲-
就好了,因此就有了我上面的寫法。
接下來用了一個date filter,這是由於若是不用這個date filter的話,它會把處理log的時間認爲是用戶訪問網頁的時間來產生表格,這樣在kibana裏看上去怪怪的,因此加這麼一個filter,但就是加這麼一個簡單的filter,也出現了問題,處理失敗,由於網上的教程裏通常都是這麼寫的:
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ] }
區別就在最後一個Z
上,個人時區字符串是+0800
,怎麼也匹配不上這個Z
,索性一怒之下直接用+0800
代替,也就過關了。
過程當中不停地訪問以下網址驗證elasticsearch的結果:
http://localhost:9200/logstas...
注意URL中那個時間,一開始的時候咱們就用處理日誌的時間訪問就能夠,但當加上date filter後就不同了,若是你還用當前日期的話,會一無所獲,改爲log裏的時間纔會看到結果,由於index日期變了。
而後就是你須要一遍一遍地清空elasticsearch裏的數據,進行調試:
curl -XDELETE 'http://localhost:9200/_all'
清空完了之後你再執行logstash,就把新數據又灌進去了:
logstash agent -f ~/logstash/logstash.conf
最後,經過kibana窗口觀察你的結果:
http://localhost:5601
一開始是在setting頁面,要你指定訪問的index,這裏就用缺省的logstash-*
就好了,而後就是頁面右上角有個時間限制,把它改爲Year to date
,不然有可能什麼數據也看不到。