在Mac平臺上安裝配置ELK時的一些總結

1、前言

大數據處理是流行的一些表現,在不斷壯大的數據處理中,怎麼樣處理數據纔是咱們繼續作好開發的正道。本文章來自網絡,不敢原創,可是也有很大借鑑。
 

2、MAC安裝ELK

 

首先是安裝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,不然有可能什麼數據也看不到。

相關文章
相關標籤/搜索