天天看點

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

場景:ELK作為一個日志收集和檢索系統,感覺功能還是相當的強大的。 

ELK是啥, 其實是是三個元件的縮寫, 分别是elasticsearch, logstash, kibana. ELK平台可以用于實作日志收集、日志搜尋和日志分析. 當然, 如果你有花不完的money, 完全可以使用商業版的Splunk, Orz...

ELK分别是什麼

1). ELK現在都是屬于elastic公司的産品, 産品首頁.

1.elasticsearch(es): 它是個開源分布式搜尋引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多資料源,自動搜尋負載等。

2.logstash: 簡單說是一個日志收集工具, 可以定義從哪裡擷取資料, 并且可以簡單處理資料, 最後可以定義将資料輸出到哪裡, 一般輸出到es. 

3.kibana: 其實就是一個資料展示界面, 并且可以分析資料, 例如從es中讀取資料進行展示分析. es自己也帶有簡單的展示dashboard: http://127.0.0.1:9200/_plugin/head/, 當然 前提是你安裝了head插件, 這個下面再說.

2). 簡單流程

下面圖簡單的展示了三元件之間的協作,

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

總的來說分成四大部分, 第一, 應用産生資料, 第二, logstash從應用收集資料, 第三, 将資料放入es, 第四, 使用kibana進行資料展示以及分析.

1 準備

1.1 環境檢測

本文介紹安裝 logstash 2.2.0 和 elasticsearch 2.2.0,作業系統環境版本是

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

安裝 JDK 是必須的,一般作業系統都會有,隻是版本的問題,這裡在安裝的過程中發現ELK大部分都要求1.8以上的JDK,是以果斷換1.8版本的JDK省事些。

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

而 Kibana 隻是一個用純 JavaScript 寫的前端 UI。一定要注意 Kibana 的版本,它會要求 ES 的版本。下表展示了kibana和Elasticsearch之間的對應關系:

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

1.2 軟體下載下傳

注意:這三個軟體之間的版本如果選擇不對,中間會出現很多想不到的問題。我這裡的總結是elasticsearch和logstash最好保持版本一直,kibana和es的版本如上表所示的對應。

 在網站中搜尋下面三個軟體的壓縮包。https://www.elastic.co/

這裡我都是選擇Linux 64位的壓縮包,然後将這三個檔案通過FTP工具上傳到自己建立的目錄下面,這裡以Etest為例。

ps:ELK三個軟體的安裝基本就是解壓,然後執行就可以運作了,是以安裝的目錄完全可以自己選擇。

logstash all plugins 2.2.0

elasticsearch 2.2.0

kibana 4.4.1      
Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

1.3 解壓縮軟體

#将軟體解壓到/usr/local目錄
##tar -xzvf elasticsearch-5.0.1.tar.gz -C /usr/local

#首先切換到軟體下載下傳目錄,然後将三個軟體直接解壓到Etset目錄
tar -xzvf elasticsearch-2.2.0.tar.gz

tar -xzvf logstash-all-plugins-2.2.0.tar.gz

tar -xzvf kibana-4.4.1-linux-x64.tar.gz      

解壓後檔案如下圖所示:

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

2 elasticsearch

2.1 啟動elasticsearch

ps:啟動時候不能以root使用者啟動,否則會報錯。

cd /home/ipsp/Etest/elasticsearch-2.2.0

#啟動指令
bin/elasticsearch      

正常啟動情況的狀态如下圖所示:

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

注意:為了能夠通過浏覽器通路elasticsearch,我們需要配置elasticsearch的配置檔案,主要是修改network.host和http.port

vim config/elasticsearch.yml

#修改配置檔案内容如下:
network.host: 0.0.0.0      

 http.port: 9200

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

之是以修改端口,是因為ES 每次啟動時,端口可能會變(端口被占用,ES 自己會改端口)~

如果還不能正常啟動 ES,并提示端口被占用,就檢視一下什麼程式占用 9200 端口,kill 掉,重新開機 ES 就行。

我遇到的,Java 把 9200 端口占用了。

 通過上述配置在浏覽器就能夠通路ElasticSearch了,這裡我使用的Chrome浏覽器,用360浏覽器每次打開都是下載下傳檔案,浏覽器的問題。 

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

2.2 檢測elasticsearch狀态

 重新打開一個終端,用非root 使用者登入, 輸入指令來檢測Elasticsearch的連通性:

curl -X GET http://localhost:9200

#需要先修改elasticsearch的配置檔案,參考2.1,這樣也能夠檢測
curl -X GET http://168.33.130.224:9200
      

狀态如圖所示:

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

2.3 插件安裝

先檢視你的 ES 都有哪些插件,這裡我已經安裝了Head插件,是以直接能看到。

[email protected]:~/Etest/elasticsearch-2.2.0> bin/plugin list

Installed plugins in /home/ipsp/Etest/elasticsearch-2.2.0/plugins:

- head

[email protected]:~/Etest/elasticsearch-2.2.0>

1、安裝Head插件

ES 支援線上和本地安裝 Head。本地安裝時,從 Github 上下載下傳 Head 插件,然後上傳到你的 ES 伺服器,比如,/home/ipsp/Etest/elasticsearch-2.2.0 目錄。

ps:線上安裝總是安裝失敗,這裡就講解下本地安裝的過程。

1、本地安裝

  • 下載下傳插件elasticsearch-head-master
  • 執行指令安裝
    bin/plugin install -v file:plugins/elasticsearch-head-master.zip      
    [[email protected] elasticsearch]# bin/plugin install -v file:plugins/elasticsearch-head-master.zip
    -> Installing from file:plugins/elasticsearch-head-master.zip...
    Trying file:plugins/elasticsearch-head-master.zip ...
    Downloading .........DONE
    Verifying file:plugins/elasticsearch-head-master.zip checksums if available ...
    NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)
    - Plugin information:
    Name: head
    Description: head - A web front end for an elastic search cluster
    Site: true
    Version: master
    JVM: false
     
    Installed head into /usr/local/elasticsearch/elasticsearch/plugins/head    //安裝成功的标志      

可以通過指令來檢視插件是否安裝完成:

bin/plugin list      

注意:install 選項,ES 的 2.* 版本,都不帶“-”橫線選項,即“-install”。

注意:若是本地安裝,而且,你把 Head 壓縮包放到了 Elasticsearch/plugins 目錄下,安裝後,一定要将 Elasticsearch-head zip 壓縮包删掉,否則啟動 ES 時會報“不能初始化插件”錯誤。

  • 浏覽器通路 http://your ip adress:9200/_plugin/head,你就會看到如下界面:
Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

關于head插件會在後面的部分進行介紹,未完待續

2、線上安裝(隻是參考)

[[email protected] elasticsearch]# bin/plugin install mobz/elasticsearch-head
-> Installing mobz/elasticsearch-head...
Trying https://github.com/mobz/elasticsearch-head/archive/master.zip ...
Downloading ...................................................................................................................................................................................................................................................................................................................................................................................................................................DONE
Verifying https://github.com/mobz/elasticsearch-head/archive/master.zip checksums if available ...
NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)
Installed head into /usr/local/elasticsearch/elasticsearch/plugins/head      

2.4 問題彙總

下面有些問題是從别的地方摘抄的,可以借鑒,有的是自己遇到的。

1、java版本不對——更換JDK版本

[[email protected] elasticsearch]# bin/elasticsearch
 
Exception in thread "main" java.lang.RuntimeException: Java version: Oracle Cooration 1.7.0_51 [Java HotSpot(TM) 64-Bit Server VM 24.51-b03] suffers from crical bug https://bugs.openjdk.java.net/browse/JDK-8024830 which can cause dataorruption.
 
Please upgrade the JVM, see http://www.elastic.co/guide/en/elasticsearch/referce/current/_installation.html for current recommendations.
 
If you absolutely cannot upgrade, please add -XX:-UseSuperWord to the JAVA_OPT environment variable.
 
Upgrading is preferred, this workaround will result in degraded performance.
 
        at org.elasticsearch.bootstrap.JVMCheck.check(JVMCheck.java:123)
 
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:283)
 
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:3
 
Refer to the log for complete error details.      

大意是:Java 運作時異常,本機版本 JDK 有 bug……讓更新 JVM。如果實在不能更新,就向 JAVA_OPT 環境變量添加 -XX:-UseSuperWord 選項。

2、elasticsearch 不能用 root 使用者運作——切換到非root使用者運作

在root使用者解壓完elasticsearch後出現如下錯誤:

[[email protected] cs408]# /usr/local/elasticsearch-5.0.1/bin/elasticsearch
[2016-11-30T09:24:56,235][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:116) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:103) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:96) ~[elasticsearch-5.0.1.jar:5.0.1] at org.elasticsearch.cli.Command.main(Command.java:62) ~[elasticsearch-5.0.1.jar:5.0.1] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-5.0.1.jar:5.0.1] at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:73) ~[elasticsearch-5.0.1.jar:5.0.1] Caused by: java.lang.RuntimeException: can not run elasticsearch as root at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:96) ~[elasticsearch-5.0.1.jar:5.0.1] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:155) ~[elasticsearch-5.0.1.jar:5.0.1] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:286) ~[elasticsearch-5.0.1.jar:5.0.1] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:112) ~[elasticsearch-5.0.1.jar:5.0.1] ... 6 more [[email protected] cs408]# vim /usr/local/elasticsearch-5.0.1/config/elasticsearch.yml      

解決方案:

因為安全問題elasticsearch 不讓用root使用者直接運作,是以要建立新使用者,這裡以已有使用者cs408為例:

第一步:liunx建立新使用者  adduser  XXX  然後給建立的使用者加密碼 passwd XXX    輸入兩次密碼。(已有可以忽略)

第二步:切換剛才建立的使用者 su XXX  然後執行elasticsearch  會顯示AccessDeniedException 權限不足。

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

第三步:給建立的XXX賦權限,chmod 777 *  這個不行,因為這個使用者本身就沒有權限,肯定自己不能給自己付權限。是以要用root使用者登入賦予權限。

第四步:root給XXX賦權限,chown -R XXX /你的elasticsearch安裝目錄。

chown -R cs408 /usr/local/elasticsearch-5.0.1       

再次執行就能看到成功輸出資訊。

bin/elasticsearch      

3 logstash

logstash 提供各種安裝包,包括 tar.gz,ZIP,DEB 和 RPM。另外,又提供了一個包含所有插件的壓縮包——logstash-all-plugins-2.2.0.tar.gz 。本文以它為例。解壓後,配置 logstash,運作即可。

3.1 建立配置檔案

logstash運作時需要使用配置檔案,主要是用于定義内容的輸入、輸出、中間處理等。

建立配置檔案所在目錄,并編輯配置檔案

cd /home/ipsp/Etest/logstash-2.2.0
vim logstash_agent.conf      

在配置檔案logstash_agent.conf添加如下内容:

input {
    stdin{} } output { elasticsearch { action => "index" # 在ES上操作index hosts => "168.33.130.224:9200" # ES位址 index => "logstash--%{+YYYY-MM}" # 索引名 }
}           

上面的配置主要是在logstash指令段輸入日志資訊,然後将日志輸出到elasticsearch中。

ps:注意這裡的index選項,我命名的是

logstash--%{+YYYY-MM},這個在後面的head插件和kibana中都會有所展現的。

3.2 啟動

bin/logstash -f logstash_agent.conf       

看到如下的内容,便表示成功了

[email protected]:~/Etest/logstash-2.2.0> bin/logstash -f logstash_agent.conf

Settings: Default pipeline workers: 40

Logstash startup completed

3.3 測試

 通過上面的配置,我們已經可以在logstash指令端輸入資訊,然後通過head插件進行檢視了:

前提要保證elasticsearch和logstash都正常啟動(需要先啟動elasticsearch,再啟動logstash,不然elasticsearch會報錯),head插件也已經正确安裝!

我們輸入Hello world!

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

在head插件中的,我們可以看到如下資訊:

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

在資料庫浏覽中,我們可以看到索引項——

logstash--%{+YYYY-MM},這個是我們在配置logstash輸出到elasticsearch的配置檔案中定義的(logstash_agent.conf)。

我在logstash指令端輸入的字元串Hello world!在head的圖形化界面能夠檢視到,其中還包含了其他一些預設的字段。

這裡每輸出一條資訊,在head插件中都能夠實時的看到,感覺很強大。

到此,elasticsearch和logstash之間的連通已經搭建成功。

3.4 插件

你可以檢視 logstash 都安裝了哪些插件

bin/plugin list      
[email protected]:~/Etest/logstash-2.2.0> bin/plugin list
logstash-codec-avro
logstash-codec-cef
logstash-codec-cloudfront
logstash-codec-cloudtrail
logstash-codec-collectd
logstash-codec-compress_spooler
logstash-codec-dots
logstash-codec-edn
logstash-codec-edn_lines
logstash-codec-es_bulk
logstash-codec-fluent
logstash-codec-graphite
logstash-codec-gzip_lines
logstash-codec-json
logstash-codec-json_lines
logstash-codec-line
logstash-codec-msgpack
logstash-codec-multiline
logstash-codec-netflow
logstash-codec-nmap
logstash-codec-oldlogstashjson
logstash-codec-plain
logstash-codec-rubydebug
logstash-codec-s3plain
logstash-codec-spool
logstash-filter-aggregate
logstash-filter-alter
logstash-filter-anonymize
logstash-filter-checksum
logstash-filter-cidr
logstash-filter-cipher
logstash-filter-clone
logstash-filter-collate
logstash-filter-csv
logstash-filter-date
logstash-filter-de_dot
logstash-filter-dns
.......................
.......................      

4 kibana

4.1 啟動

[email protected]:~/Etest> cd kibana-4.4.1-linux-x64/

[email protected]:~/Etest/kibana-4.4.1-linux-x64> bin/kibana

如果看到類似如下輸出,就代表成功了:

[email protected]:~/Etest/kibana-4.4.1-linux-x64> bin/kibana

log [16:59:39.891] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready

log [16:59:39.942] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch

log [16:59:39.961] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready

log [16:59:39.974] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready

log [16:59:39.983] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready

log [16:59:39.987] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready

log [16:59:39.991] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready

log [16:59:39.995] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready

log [16:59:40.026] [info][listening] Server running at http://168.33.130.224:5601

log [16:59:40.040] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready

通過浏覽器通路http://168.33.130.224:5601/就可以看到kibana界面了。

配置ES索引:

kibana第一次使用時,會要求建立index,隻要按照預設值即可。

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

首次會提示沒有索引。。。。

首先需要加上我們剛剛建立的索引

index => "logstash--%{+YYYY-MM}" (這裡請參考3.1中的logstash_agent.conf的配置)

, 點選setting->indices, 在這裡我們可以Configure an index pattern, 也就是說可以配置 正則比對的index,

可以看到預設的index是"logstash-*", 預設是從logstash導出的資料, 因為我們在logstash中配置的索引就是logstash開頭的,是以這裡我們保持預設不變.

下面還有一個Time-field name, 一般來說time都是一個必要的字段, 并且這個字段的類型是date類型! 不是string!!! 如果沒有時間字段, 那麼将上面的" Index contains time-based events" 取消就OK.

建立完索引是這樣的:

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

點選菜單欄: Discover, 如果沒有看到資料, 那麼點選右邊的時間, 改成Today, 現在你應該能看到資料了吧...反正我能看到:

ps:這裡的時間是以Linux伺服器中的時間為主。我這裡點today看不到,點的This Week才看到:

Linux日志分析ELK環境搭建1 準備2 elasticsearch3 logstash4 kibana

在上面可以直接搜尋,很友善。其他功能待開發。

4.2 問題

1、出現Configure an index pattern create是灰色的的問題

這個問題是配置檔案的問題,修改logstash的配置檔案,使其輸出到elasticsearch,其中的index選項配置為kibana上的index,比如我是index => "logstash--%{+YYYY-MM}" ,這個時候重新開機logstash,kibana就保持預設的logstash-*索引既可,應該能夠看到Create按鈕了