1. 程式人生 > >日誌分析(Elastic Stack 5.0)系統搭建參考

日誌分析(Elastic Stack 5.0)系統搭建參考

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

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

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

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

  • Elasticsearch是個開源分散式搜尋引擎,它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。
  • Logstash是一個完全開源的工具,他可以對你的日誌進行收集、過濾,並將其儲存供以後使用(如,搜尋)。
  • Kibana 也是一個開源和免費的工具,它Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助您彙總、分析和搜尋重要資料日誌。

—————————-摘抄內容結束——————————-

畫了一個ELK工作的原理圖:

如圖:Logstash收集AppServer產生的Log,並存放到ElasticSearch叢集中,而Kibana則從ES叢集中查詢資料生成圖表,再返回給Browser。

ELK平臺搭建

系統環境

System: Centos release 6.7 (Final)

ElasticSearch: 2.1.0

Logstash: 2.1.1

Kibana: 4.3.0

Java: openjdk version  ”1.8.0_65″

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

ElasticSearch

配置ElasticSearch:

1

2

tar -zxvf elasticsearch-2.1.0.tar.gz

cd elasticsearch-2.1.0

安裝Head外掛(Optional):

1

./bin/plugin install mobz/elasticsearch-head

然後編輯ES的配置檔案:

1

vi config/elasticsearch.yml

修改以下配置項:

1

2

3

4

5

6

7

cluster.name=es_cluster

node.name=node0

path.data=/tmp/elasticsearch/data

path.logs=/tmp/elasticsearch/logs

#當前hostname或IP,我這裡是centos2

network.host=centos2

network.port=9200

其他的選項保持預設,然後啟動ES:

1

./bin/elasticsearch

可以看到,它跟其他的節點的傳輸埠為9300,接受HTTP請求的埠為9200。

使用ctrl+C停止。當然,也可以使用後臺程序的方式啟動ES:

1

./bin/elasticsearch &

然後可以開啟頁面localhost:9200,將會看到以下內容:

返回展示了配置的cluster_name和name,以及安裝的ES的版本等資訊。

剛剛安裝的head外掛,它是一個用瀏覽器跟ES叢集互動的外掛,可以檢視叢集狀態、叢集的doc內容、執行搜尋和普通的Rest請求等。現在也可以使用它開啟localhost:9200/_plugin/head頁面來檢視ES叢集狀態:

可以看到,現在,ES叢集中沒有index,也沒有type,因此這兩條是空的。

Logstash

Logstash的功能如下:

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

配置Logstash:

1

2

tar -zxvf logstash-2.1.1.tar.gz

cd logstash-2.1.1

編寫配置檔案(名字和位置可以隨意,這裡我放在config目錄下,取名為log4j_to_es.conf):

1

2

mkdir config

vi config/log4j_to_es.conf

輸入以下內容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# 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 => "centos2"

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  => "centos2:9200"   #ElasticSearch host, can be array.

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

}

}

logstash命令只有2個引數:

因此使用agent來啟動它(使用-f指定配置檔案):

1

./bin/logstash agent -f config/log4j_to_es.conf

到這裡,我們已經可以使用Logstash來收集日誌並儲存到ES中了,下面來看看專案程式碼。

Java專案

照例先看專案結構圖:

pom.xml,很簡單,只用到了Log4j庫:

1

2

3

4

5

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.17</version>

</dependency>

log4j.properties,將Log4j的日誌輸出到SocketAppender,因為官網是這麼說的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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=centos2

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。

Application.java,使用Log4j的LOGGER列印日誌即可:

1

2

3

4

5

6

7

8

9

10

11

12

13

package com.demo.elk;

import org.apache.log4j.Logger;

public class Application {

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

public static void main(String[] args) throws Exception {

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

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

Thread.sleep(500);

}

}

}

用Head外掛檢視ES狀態和內容

執行Application.java,先看看console的輸出(當然,這個輸出只是為了做驗證,不輸出到console也可以的):

再來看看ES的head頁面:

切換到Browser標籤:

單擊某一個文件(doc),則會展示該文件的所有資訊:

上面使用了ES的Head外掛觀察了ES叢集的狀態和資料,但這只是個簡單的用於跟ES互動的頁面而已,並不能生成報表或者圖表什麼的,接下來使用Kibana來執行搜尋並生成圖表。

Kibana

配置Kibana:

1

2

3

tar -zxvf kibana-4.3.0-linux-x86.tar.gz

cd kibana-4.3.0-linux-x86

vi config/kibana.yml

修改以下幾項(由於是單機版的,因此host的值也可以使用localhost來代替,這裡僅僅作為演示):

1

2

3

4

server.port: 5601

server.host: “centos2”

elasticsearch.url: http://centos2:9200

kibana.index: “.kibana”

啟動kibana:

1

./bin/kibana

用瀏覽器開啟該地址:

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

點選Create後,可以看到左側增加了配置的Index名字:

接下來切換到Discover標籤上,注意右上角是查詢的時間範圍,如果沒有查詢到資料,那麼你就可能需要調整這個時間範圍了,這裡我選擇Today:

接下來就能看到ES中的資料了:

執行搜尋看看呢:

點選右邊的儲存按鈕,儲存該查詢為search_all_logs。接下來去Visualize頁面,點選新建一個柱狀圖(Vertical Bar Chart),然後選擇剛剛儲存的查詢search_all_logs,之後,Kibana將生成類似於下圖的柱狀圖(只有10條日誌,而且是在同一時間段的,比較醜,但足可以說明問題了:)  ):

你可以在左邊設定圖形的各項引數,點選Apply Changes按鈕,右邊的圖形將被更新。同理,其他型別的圖形都可以實時更新。

點選右邊的儲存,儲存此圖,命名為search_all_logs_visual。接下來切換到Dashboard頁面:

單擊新建按鈕,選擇剛剛儲存的search_all_logs_visual圖形,面板上將展示該圖:

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

如果設定的時間間隔夠短,就很趨近於實時分析了。

到這裡,ELK平臺部署和基本的測試已完成。