1. 程式人生 > >ELK實時日誌分析平臺部署搭建詳細實現過程

ELK實時日誌分析平臺部署搭建詳細實現過程

原文地址:http://www.linuxidc.com/Linux/2016-09/135137.htm

1、ELK平臺介紹

在搜尋ELK資料的時候,發現這篇文章比較好,於是摘抄一小段:

日誌主要包括系統日誌、應用程式日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解伺服器軟硬體資訊、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解伺服器的負荷,效能安全性,從而及時採取措施糾正錯誤。

通常,日誌被分散的儲存不同的裝置上。如果你管理數十上百臺伺服器,你還在使用依次登入每臺機器的傳統方法查閱日誌。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日誌管理,例如:開源的syslog,將所有伺服器上的日誌收集彙總。

集中化管理日誌後,日誌的統計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。

開源實時日誌分析ELK平臺能夠完美的解決我們上述的問題,ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成。官方網站: 

E:\u\elk\pic\01_1.png

2、安裝準備

Elk平臺環境

系統

版本

伺服器作業系統

CentOS release 6.7 (Final)

ElasticSearch

2.3.4

Logstash

2.3.4

Kibana

4.5.3

Jdk

1.8

注:由於Logstash的執行依賴於Java環境,而Logstash1.5以上版本不低於java 1.7,因此推薦使用最新版本的Java。因為我們只需要Java的執行環境,所以可以只安裝JRE,不過這裡我依然使用JDK,請自行搜尋安裝,我這裡準備使用1.7

3、下載

從中獲得下載地址:

4、安裝除錯

4.1、安裝jdk

使用root安裝jdk

mkdir -p /usr/lib/jvm

tar -xvf  jdk-8u45-linux-x64.tar.gz -C /usr/lib/jvm

# vim /etc/profile 配置系統引數
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_45
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_45/bin/java 300

sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_45/bin/javac 300

4.2、安裝elasticsearch

使用elk賬號安裝elasticearch:

解壓縮安裝

useradd elk

su - elk

tar -xvf elasticsearch-2.3.4.tar.gz

cd elasticsearch-2.3.4

安裝Head外掛

./bin/plugin install mobz/elasticsearch-head

ls plugins/

# ls能看到head檔案即可表示ok了。

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$ ll plugins/

總用量 4

drwxrwxr-x. 5 elk elk 4096 8月  2 17:26 head

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$

編譯es的配置檔案:

cluster.name: es_cluster

node.name: node0

path.data: /home/elk/data

path.logs: /home/elk/logs

當前的host ip地址

network.host: 192.168.121.62

network.port: 9200

啟動es:

./bin/elasticsearch &

看後臺日誌,發現它和其它的節點的傳輸埠為9300,而接受HTTP請求的埠為9200。日誌如下所示:

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$ more ../logs/es_cluster.log

[2016-08-02 17:47:23,285][WARN ][bootstrap                ] unable to install syscall filter: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled

in

[2016-08-02 17:47:23,579][INFO ][node                    ] [node0] version[2.3.4], pid[21176], build[e455fd0/2016-06-30T11:24:31Z]

[2016-08-02 17:47:23,586][INFO ][node                    ] [node0] initializing ...

[2016-08-02 17:47:24,213][INFO ][plugins                  ] [node0] modules [reindex, lang-expression, lang-groovy], plugins [head], sites [head]

[2016-08-02 17:47:24,235][INFO ][env                      ] [node0] using [1] data paths, mounts [[/home (/dev/mapper/vg_dbmlslave1-lv_home)]], net usable_space [542.1gb], net total_space [10

17.2gb], spins? [possibly], types [ext4]

[2016-08-02 17:47:24,235][INFO ][env                      ] [node0] heap size [989.8mb], compressed ordinary object pointers [true]

[2016-08-02 17:47:24,235][WARN ][env                      ] [node0] max file descriptors [4096] for elasticsearch process likely too low, consider increasing to at least [65536]

[2016-08-02 17:47:25,828][INFO ][node                    ] [node0] initialized

[2016-08-02 17:47:25,828][INFO ][node                    ] [node0] starting ...

[2016-08-02 17:47:25,939][INFO ][transport                ] [node0] publish_address {192.168.121.62:9300}, bound_addresses {192.168.121.62:9300}

[2016-08-02 17:47:25,944][INFO ][discovery                ] [node0] es_cluster/626_Pu5sQzy96m7P0EaU4g

[2016-08-02 17:47:29,028][INFO ][cluster.service          ] [node0] new_master {node0}{626_Pu5sQzy96m7P0EaU4g}{192.168.121.62}{192.168.121.62:9300}, reason: zen-disco-join(elected_as_master,

[0] joins received)

[2016-08-02 17:47:29,116][INFO ][http                    ] [node0] publish_address {192.168.121.62:9200}, bound_addresses {192.168.121.62:9200}

[2016-08-02 17:47:29,117][INFO ][node                    ] [node0] started

[2016-08-02 17:47:29,149][INFO ][gateway                  ] [node0] recovered [0] indices into cluster_state

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$

 

看返回結果,有配置的cluster_name、節點name資訊以及安裝的軟體版本資訊,其中安裝的head外掛,它是一個用瀏覽器跟ES叢集互動的外掛,可以檢視叢集狀態、叢集的doc內容、執行搜尋和普通的Rest請求等。可以使用web介面來操作檢視http://192.168.121.62:9200/_plugin/head/,如下圖E:\u\elk\pic\01_4.png:

可以從介面看到,當前的elas叢集裡面沒有index也沒有type,所以是空記錄。

4.3、安裝logstash

logstash其實它就是一個 收集器 而已,我們需要為它指定Input和Output(當然Input和Output可以為多個)。由於我們需要把Java程式碼中Log4j的日誌輸出到ElasticSearch中,因此這裡的Input就是Log4j,而Output就是ElasticSearch。

結構圖如E:\u\elk\pic\02.png所示:

 

安裝配置:

解壓縮安裝

tar -xvf logstash-2.3.4.tar.gz

cd logstash-2.3.4

將配置檔案放置在config資料夾下面

mkdir config

vim config/log4j_to_es.conf

# For detail structure of this file

# Set: https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html

input {

  # For detail config for log4j as input,

  # See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html

  log4j {

    mode => "server"

    host => "192.168.121.62"

    port => 4567

  }

}

filter {

  #Only matched data are send to output.

}

output {

  # For detail config for elasticsearch as output,

  # See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html

  elasticsearch {

    action => "index"          #The operation on ES

    hosts  => "192.168.121.62:9200"  #ElasticSearch host, can be array.

    index  => "applog"        #The index to write data to.

  }

}

啟動logstash,2個引數一個是agent一個是配置檔案:

[[email protected]_test_dbm1_121_62 logstash-2.3.4]$ ./bin/logstash agent -f config/log4j_to_es.conf

Settings: Default pipeline workers: 32

log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAuthCache).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

Pipeline main started

接下來,可以使用logstash來收集日誌並儲存到es中了,可以使用一段java程式碼來實現它。

4.4elk3測試工程

工程環境是eclipse,工程大概目錄結構如下圖E:\u\elk\pic\04.png,一個java類Application.java,一個日誌配置檔案log4j.properties,一個排程配置檔案pom.xml:

1Application.java

package com.demo.elk;

import org.apache.log4j.Logger;

public class Application {

      private static final Logger LOGGER = Logger.getLogger(Application.class);

      public Application() {

          // TODO Auto-generated constructor stub

      }

      public static void main(String[] args) {

          // TODO Auto-generated method stub

        for (int i = 0; i < 10; i++) {

            LOGGER.error("Info log [" + i + "].");

            try {

                      Thread.sleep(500);

                } catch (InterruptedException e) {

                      // TODO Auto-generated catch blockl

                      e.printStackTrace();

                }

        }

      }

}

2Pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>elk3</groupId>

  <artifactId>elk3</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <name>elk3</name>

  <dependency>

    <groupId>log4j</groupId>

    <artifactId>log4j</artifactId>

    <version>1.2.17</version>

</dependency>

</project>

3 log4j.properties

Log4j.properties,將Log4j的日誌輸出到 SocketAppender ,因為官網是這麼說的E:\u\elk\pic\01_5.png:

Log4j.properties檔案:

log4j.rootLogger=INFO,console

# for package com.demo.elk, log would be sent to socket appender.

log4j.logger.com.demo.elk=DEBUG, socket

# appender socket

log4j.appender.socket=org.apache.log4j.net.SocketAppender

log4j.appender.socket.Port=4567

log4j.appender.socket.RemoteHost=192.168.121.62

log4j.appender.socket.layout=org.apache.log4j.PatternLayout

log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n

log4j.appender.socket.ReconnectionDelay=10000

# appender console

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.target=System.out

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%l] %m%n

注意:這裡的埠號需要跟Logstash監聽的埠號一致,這裡是4567。

4.5eclipse除錯結果

1eclipse檢視除錯結果

在eclipse裡面允許java程式,檢視console的輸出資訊(這個output只是為了做一驗證,沒有這一步不輸出到console也是可以的),除錯成功後輸出結果如下圖E:\u\elk\pic\05.png所示:

2)去Elasticsearchhead介面檢視效果

去介面http://192.168.121.62:9200/_plugin/head/檢視效果,點選概覽裡面,看到下面綠色的就是primay分片,下面灰色的為非primay備份分片,如下圖E:\u\elk\pic\06.png所示:

其中:

A:docs: 20(20) 表示一共有20個文件,一個文件一個日誌記錄;

B:node0  表示只有一個分片,5個備份,分片暫時沒有地方存放,所以顯示為灰色Unassigned狀態;

C:es_cluster叢集健康值: yellow (6 of 12)表示因為有的分片沒有地方存放所以叢集報出了警告的黃色字型資訊;

3)去Elasticsearchbrower介面檢視效果

E:\u\elk\pic\07.png

其中索引中的.kibana applog:表示是生成的索引叢集,kibana暫時是空的,沒有記錄不遍歷查詢,而applog5個分片記錄。

查詢 6 個分片中用的 5 個. 30 命中. 耗時 0.054 秒 表示:看到6個分片,其中有5個是applog,有30個是執行了3次eclipse所產生的log記錄次數。

4)檢視單個文件_index資訊

在選擇中的單個文件,點選左鍵,就會彈出單個文件的全部資訊,除了message是我們的日誌內容,其它都是logstash增加的內容資訊,新增加的這些欄位資訊涵義可以參考官網:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html的描述,如下圖E:\u\elk\pic\08.png所示

 

PS總結:上面列出的都是單個EShead介面元件檢視到的elas叢集的資料和狀態,只是一個簡單的和elas的互動介面,並不能形成報表或者動態的圖表,所以我們需要其它的專業工具來做搜尋並生成圖表。         

4.6、安裝kinana

解壓縮安裝

tar -xvf kibana-4.5.3-linux-x64.tar.gz

cd kibana-4.5.3-linux-x64

配置修改配置

vim config/kibana.yml  server.port: 5601

server.host: "192.168.121.62"

kibana.index: ".kibana"

啟動kibana

./bin/kibana

[[email protected]_test_dbm1_121_62 kibana-4.5.3-linux-x64]$ ./bin/kibana

  log  [14:53:15.975] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready

  log  [14:53:16.021] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch

  log  [14:53:16.036] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready

  log  [14:53:16.046] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready

  log  [14:53:16.052] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready

  log  [14:53:16.064] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready

  log  [14:53:16.068] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready

  log  [14:53:16.072] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready

  log  [14:53:16.075] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready

  log  [14:53:16.084] [info][listening] Server running at http://192.168.121.62:5601

./bin/kibana

4.7、配置kibana

為了後續使用Kibana,需要配置至少一個Index名字或者Pattern,它用於在分析時確定ES中的Index。這裡我輸入之前配置的Index名字applog,Kibana會自動載入該Index下doc的field,並自動選擇合適的field用於圖示中的時間欄位:

再開啟http://192.168.121.62:5601/app/kibana,輸入applog,會自動彈出如下介面,然後點選“create”按鈕儲存下,如下圖E:\u\elk\pic\09.png所示:

建立完成後,自動彈出成功介面,如下圖E:\u\elk\pic\10.png所示:

4.8kibana生成圖表

選擇左上角的“Discover”,然後再選擇右上角的“List 15 minutes”(如果右上角預設的時間查詢沒有資料,就需要手動調整查詢時間了),如下圖E:\u\elk\pic\12.png所示:

這裡為了看到資料資訊,所以保守的選擇了“Today”,然後會看到今天的記錄,也即是看到的elas中的資料記錄了,如下圖E:\u\elk\pic\13.png所示:

在輸入框裡面,輸入info字樣,點選搜尋按鈕搜尋,可以看到搜尋匹配的資訊如下E:\u\elk\pic\14.png:

 

點選右上角的“Save Search”按鈕,就會儲存此次的search結果,如下圖E:\u\elk\pic\16.png所示:

 

接下來去Visualize頁面,點選新建一個柱狀圖(Vertical Bar Chart),然後選擇剛剛儲存的查詢search_logs_save_1,如下圖E:\u\elk\pic\17.png所示:

 

之後進入左邊選擇x軸為Date Histogram時間軸,顯示為時分,間隔為Auto自動間隔,然後點選綠色的三角形按鈕“Apply Changes”,kibana將生成類似於下圖的柱狀圖,如下圖E:\u\elk\pic\18.png所示:

 

然後點選右邊的儲存按鈕“Save Visualization”,可以儲存此圖為search_log_visual_1,如下圖E:\u\elk\pic\19.png所示:

然後進入“Dashboard”介面,點選下面的灰色背景的“+”按鈕,如下圖E:\u\elk\pic\20.png所示:

然後選擇我們剛才儲存的visual圖,就會展示出來上次我們生成的圖表記錄,面板上就會顯示出原來的圖表,如下圖E:\u\elk\pic\21.png所示:

如果有較多資料,我們可以根據業務需求和關注點在Dashboard頁面新增多個圖表:柱形圖,折線圖,地圖,餅圖等等。當然,我們可以設定更新頻率,讓圖表自動更新,如下圖E:\u\elk\pic\22.png所示:

當然如果設定的時間比較緊湊,比較短暫的話,其實就相當於實時分析的圖表了,類似於zabbix的監控圖了。

OK,最基本的elk平臺部署和除錯的流程就走完了,接下來就是各種業務場景的使用了。

5、一些錯誤記錄

(1)start 問題

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$ ./bin/elasticsearch &

[1] 20726

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$ Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]];

Likely root cause: ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]]

        at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:65)

        at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:45)

        at org.elasticsearch.common.settings.loader.YamlSettingsLoader.load(YamlSettingsLoader.java:46)

        at org.elasticsearch.common.settings.Settings$Builder.loadFromStream(Settings.java:1080)

        at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067)

        at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88)

        at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:107)

        at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:100)

        at org.elasticsearch.bootstrap.BootstrapCLIParser.<init>(BootstrapCLIParser.java:48)

        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:226)

        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)

Refer to the log for complete error details.

[1]+  Exit 1                  ./bin/elasticsearch

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$

原因是:配置檔案中的=要換成:

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$ more config/elasticsearch.yml  |grep -v "#"

cluster.name: es_cluster

node.name: node0

path.data: /home/elk/data

path.logs: /home/elk/logs

network.host: 192.168.121.62

network.port: 9200

[[email protected]_test_dbm1_121_62 elasticsearch-2.3.4]$

(2)、Unable to fetch mapping.

Unable to fetch mapping. Do you haveindices matching the pattern?

這就說明logstash沒有把日誌寫入到elasticsearch。

解決方法:

檢查logstash與elasticsearch之間的通訊是否有問題,一般問題就在這。

(3)、log4j報錯

log4j:WARN No appenders could be foundfor logger (com.demo.elk.Application).

log4j:WARN Please initialize the log4jsystem properly.

log4j:WARN Seehttp://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

解決:

(a)jdk版本比較低,需要jdk1.7以上

(b)java類和log4j.properties沒有匹配上,在測試中需要將java類和log4j.properties放在一個目錄上。