原創:花括號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,除了Elasticsearch
、Kibana
、Logstash
還增加了Beats
,主要用於資料收集。
一點點說明:
本文基於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
支援很多輸出配置,最常用的就是輸出到Kafka
和logstash
,當然了也可以直接輸入到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進行儲存的配置。
先在Logstash
的config
目錄下,建立一個配置檔案,假設叫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
也可以很好的完成相關工作。如果想對日誌資訊做一些處理,那麼Grok
的filter
外掛,就有必要了解一下。
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 }
,那麼螢幕上的輸出如下。
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中配置的索引名稱)。新增完成後就可以搜尋了。下面我放一個截圖,大家感受一下,重點關注地方都用箭頭標出了。
結束
這僅僅是一篇拋磚引玉的文章,Elastic Stack裡面的每個元件都大有乾坤,如果各位有精力,建議深入的研究,會有頗多收穫。
推薦閱讀
·END·
Java·大資料·個人成長