手把手教你搭建一套ELK日誌搜尋運維平臺

花括號MC發表於2020-03-20

原創:花括號MC(微信公眾號:huakuohao-mc)。關注JAVA基礎程式設計及大資料,注重經驗分享及個人成長。

有些事情,當我們勇敢的邁出第一步的時候,其實就已經完成了50%。很顯然,學習ELK就屬於這樣的事情。很多對ELK不瞭解的同學,每當想學習的時候,就會因為涉及的元件比較多,導致自己不知道如何開始,最後的結果就是永遠沒有開始,讓自己一直處於臨淵羨魚的狀態。

大部分程式設計師學一門新語言的時候都是從“hello world”開始的。其實ELK也有自己的“hello world”。只不過這個“hello world”需要的元件及配置有點兒多。

這邊文章我會帶著大家搭建一個實時的日誌搜尋平臺。將業務系統產生的日誌(模擬),源源不斷的收集到Elasticsearch 中,最後通過Kibana 進行查詢展示。

如果這篇文章中出現的一些細節使你困惑,那麼就暫時放過自己,爭取先把這一切都跑通,畢竟你剛開始學Java 的時候,對"hello world"程式裡面的每一行程式碼也不是真正的理解。

ELK是 Elasticsearch,Logstash,Kibana 三個元件的首字母縮寫,這是原來的叫法,現在新的叫法是Elastic Stack,除了ElasticsearchKibanaLogstash還增加了Beats,主要用於資料收集。

手把手教你搭建一套ELK日誌搜尋運維平臺

一點點說明: 本文基於centos7.5 的作業系統,Elastic Stack基於最新的7.6版本。 本文只涉及單點的搭建及配置,至於叢集的配置及調優不在本文討論範圍內。 本文假定的業務系統產生的日誌格式如下:

|07801302020021914554950568859|127.0.0.1|2020-02-19 14:55:49[INFO][Thread-4][com.hello.frank.test.TestUser]-user msg jack

Elasticsearch

介紹

Elasticsearch 是一款提供分散式資料儲存,搜尋及分析的資料引擎。有很多的應用場景,但是使用最多的還是儲存日誌資訊,用於日常運維及商業分析。

安裝
#下載
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-linux-x86_64.tar.gz
#解壓
tar -xzvf elasticsearch-7.6.1-linux-x86_64.tar.gz
cd elasticsearch-7.6.1
#啟動
./bin/elasticsearch
複製程式碼

Elasticsearch 的配置檔案是config/elasticsearch.yml。預設情況下,Elasticsearch 只允許本機訪問,所以我們只需要簡單的修改一下配置檔案,將 network.host 前面的註釋去掉,同時將值改成 0.0.0.0,表示所有機器都可以訪問,然後重啟一下就OK了。

啟動後,可以通過 curl http://hostIp:9200 進行測試,如果看到如下資訊就證明Elasticsearch 安裝完了。

{
  "name" : "localhost",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "1ew0o-aXSpq8Tfv0zCWE3Q",
  "version" : {
    "number" : "7.6.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
    "build_date" : "2020-02-06T00:09:00.449973Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

複製程式碼

注意:Elasticsearch 啟動的時候,如果報錯"max virtual memory areas vm.maxmapcount [65530] is too low",需要執行$ sudo sysctl -w vm.max_map_count=262144,來修改最大虛擬記憶體數。

FileBeat

介紹

ELK平臺提供了很多 Beat 元件,目的是為了收集各種不同的資料來源,比如有針對日誌檔案的FileBeat,也有針對系統執行資訊的MetricBeat,還有針對網路包的PacketBeat。 這裡我拿FileBeat 的安裝和使用來舉例,演示一下如何收集應用的日誌資訊。

安裝
#下載
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-linux-x86_64.tar.gz
#解壓
tar xzvf filebeat-7.6.1-linux-x86_64.tar.gz
複製程式碼
配置

使用 Filebeat 進行日誌收集,只需要對配置檔案進行簡單的修改就OK。 Filebeat 的配置檔案是filebeat.yml。所有的配置都在這個檔案下進行。

輸入配置

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/*.log
複製程式碼

上面這段簡單的配置,表示收集/var/log下面的所有.log檔案。同時還可以這樣配置/var/log/*/*.log ,來抓取log子目錄下的所有.log檔案。注意不會抓取log目錄下的.log檔案。

輸出配置 ·Filebeat支援很多輸出配置,最常用的就是輸出到Kafkalogstash,當然了也可以直接輸入到Elasticsearch

輸出到Elasticsearch 的配置

output.elasticsearch:
  hosts: ["ES-host:9200"]
複製程式碼

輸出到Logstash的配置。

output.logstash:
  hosts: ["logstash-host:5044"]
複製程式碼

Logstash可以對日誌進行過濾和清洗,如果日誌量太大,單節點的Logstash很可能滿足不了需求。Filebeat支援同時輸出到多個Logstash

負載均衡配置 支援負載均衡的配置也很簡單,配置如下。

output.logstash:
  hosts: ["localhost:5044", "localhost:5045"]
  loadbalance: true
複製程式碼

相比單節點的配置,只是增加了一個loadbalance的屬性,同時將新增的節點加到hosts陣列裡就OK了。

注意 loadbalance屬性只對Redis,Logstash,和Elasticsearch起作用,Kafka自己就可以實現負載均衡,不用Filebeat來操心。

此外Filebeat還支援多個執行緒工作模式,預設的work 是1,如果想增加worker 數量,只許增加work 屬性的配置就OK。

filebeat.inputs:
- type: log
  paths:
    - /var/log/*.log
output.logstash:
  hosts: ["localhost:5044", "localhost:5045"]
  loadbalance: true
  worker: 2
複製程式碼

上面的配置表示一共有4(host * work)個worker在工作。

啟動

通過 ./filebeat -e -c filebeat.yml -d "publish" 啟動Filebeat。 如果上面已經成功啟動ES,同時你的FileBeat的配置又是輸出到Elasticsearch。啟動之後,你的日誌就會源源不斷的儲存到Elasticsearch

Filebeat是通過FileBeat安裝目錄下的data目錄進行日誌檔案資訊管理的,如果在測試階段,想重複收集相同的日誌,需要每次把data目錄下的資訊清空然後在重新啟動。

Logstash

介紹

Logstash是一款強大的資料處理工具,可以幫助我們處理從資料來源傳送過來的資料。同時將加工之後的資訊傳送到Elasticsearch。在ELK裡面扮演者承上啟下的作用。

安裝
#下載
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.6.1.tar.gz
#解壓
tar -xzvf logstash-7.6.1.tar.gz
複製程式碼
配置

Logstash提供了input外掛,用於讀取各種資料來源的資料。這裡配置一個接收FileBeat傳送過來的資料,然後將資料做簡單之後傳送到ES進行儲存的配置。

先在Logstashconfig 目錄下,建立一個配置檔案,假設叫blog-pipeline.conf,檔案中的內容是這個樣子。

input {
    beats{
        port => "5044"
    }
}

output{
    #stdout { codec => rubydebug }
    elasticsearch{
        hosts => [ "localhost" ]
	    index => "blog-demo"
    }
}
複製程式碼

配置很簡單,分為輸入和輸出兩個部分。輸入部分的port埠號就是上面提到的Filebeat的埠號。output的配置部分表示輸出到ES。 配置檔案中註釋的那一行,是方便大家除錯用的,開啟那一行,可以把輸出列印到控制檯,方便我們除錯,以免除錯階段產生的資料汙染ES中生產資料。

Elasticsearch中 index的概念可以簡單的理解成關聯式資料庫中表的概念。如果不配置index項,預設值是logstash。

啟動

通過 ./bin/logstash -f ./config/blog-pipeline.conf 啟動Logstash 如果一切都正常,你可以在啟動Logstash 的控制檯看到收集的日誌了(記得除錯的時候使用stdout { codec => rubydebug })。

Grok filter

如果只是原樣的將日誌資訊存入ES,那麼就沒有必要使用Logstash了。因為FileBeat 也可以很好的完成相關工作。如果想對日誌資訊做一些處理,那麼Grokfilter外掛,就有必要了解一下。

grok是一款方便大家使用的正規表示式庫,裡面封裝了很多常用的正則,當然了我們也可以自定義。具體預定義了哪些正則,我們可以去這裡看,如果需要對grok進行除錯,可以使用這個網址,除錯的網址需要翻強。

下面我們針對文章開頭提到的日誌樣例,進行正則匹配。當然了這個過濾只是為了演示grok如何使用,並沒有過濾掉日誌中任何一部分資訊,實際使用中可以提取感興趣的日誌資訊進行入庫。

Grok的外掛使用很簡單,只需要在Logstash的配置檔案中增加如下資訊就OK。

filter {
    grok {
		match => { "message" => "\|%{GREEDYDATA:traceid}\|%{IPV4:serverip}\|%{GREEDYDATA:logdate}\[%{LOGLEVEL:loglevel}\]\[%{GREEDYDATA:thread}\]\[%{GREEDYDATA:classname}\]-%{GREEDYDATA:logmessage}" }
        overwrite => [ "message" ]
		 remove_field => [ "host","ecs",
			  "agent","version",
			  "log", "input", "tags",
			  "@version","message" ]
	}
}
複製程式碼

Logstash 的完整配置如下

input {
    beats{
        port => "5044"
    }
}

filter {
    grok {
		match => { "message" => "\|%{GREEDYDATA:traceid}\|%{IPV4:serverip}\|%{GREEDYDATA:logdate}\[%{LOGLEVEL:loglevel}\]\[%{GREEDYDATA:thread}\]\[%{GREEDYDATA:classname}\]-%{GREEDYDATA:logmessage}" }
        overwrite => [ "message" ]
		 remove_field => [ "host","ecs",
			  "agent","version",
			  "log", "input", "tags",
			  "@version","message" ]
	}
}

output{
    #stdout { codec => rubydebug }
    elasticsearch{
        hosts => [ "es-host" ]
	    index => "blog-demo"
    }
}
複製程式碼
啟動

再次啟動Logstash。如果你使用的是stdout { codec => rubydebug },那麼螢幕上的輸出如下。

手把手教你搭建一套ELK日誌搜尋運維平臺

Kibana

介紹

Kibana是一款開源的,用於資料分析展示的平臺。經常跟ElasticSearch配合使用。簡單的說就是為ElasticSearch提供前端的資料搜尋及分析的展示介面,功能強大,各種圖表樣式豐富。

安裝
#下載
curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.6.1-linux-x86_64.tar.gz
#解壓
tar xzvf kibana-7.6.1-linux-x86_64.tar.gz
#啟動
cd kibana-7.6.1-linux-x86_64/
./bin/kibana
複製程式碼
配置

Kibana 的配置檔案是,config/kibana.yml。預設埠號是5601。啟動Kibana 之前需要告訴Kibana 連線哪個ES。在配置檔案中修改如下配置elasticsearch.hosts:["http://ES-host:9200"] 即可

現在你可以通過瀏覽器訪問Kibana了,如果你想查詢剛剛存入Elasticsearch 的日誌資訊,還需要在Kibana的頁面做如下配置。

Kibana的左側邊欄找到management,點選進去之後,找到kibana的索引管理,新增blog-demo索引(Logstash中配置的索引名稱)。新增完成後就可以搜尋了。下面我放一個截圖,大家感受一下,重點關注地方都用箭頭標出了。

手把手教你搭建一套ELK日誌搜尋運維平臺

結束

這僅僅是一篇拋磚引玉的文章,Elastic Stack裡面的每個元件都大有乾坤,如果各位有精力,建議深入的研究,會有頗多收穫。


推薦閱讀

教你如何學習Java的 NIO

這也許就是產品和開發互撕的本質原因吧

Java程式設計師必讀核心書單—基礎版

·END·
 

花括號MC

Java·大資料·個人成長

微訊號:huakuohao-mc

相關文章