一:概念
ELK是Elasticsearch、Logstash、Kibana三大開源框架首字母大寫簡(jiǎn)稱,具體這三個(gè)工具的詳細(xì)介紹,百度都解釋的很詳細(xì),今天我主要分享一下我實(shí)際中使用的問題和難點(diǎn)。
二:目的
簡(jiǎn)單來說就是快速查看項(xiàng)目錯(cuò)誤日志,快速鎖定問題。由于項(xiàng)目的使用用戶日益劇增,一臺(tái)服務(wù)器已經(jīng)扛不住上萬人的訪問系統(tǒng),導(dǎo)致系統(tǒng)訪問慢,超時(shí)等問題。所以團(tuán)隊(duì)開始提出負(fù)載均衡以及集群的一個(gè)搭建,下個(gè)文章我會(huì)分享我在負(fù)載均衡以及配置nginx等詳細(xì)文章,這里就不多介紹了。集群搭建好了就出現(xiàn)一個(gè)問題--日志。由于我們?nèi)罩疚募际窃诿總€(gè)集群服務(wù)器,導(dǎo)致系統(tǒng)異常,我們無法快速追蹤到具體出錯(cuò)日志在哪臺(tái)服務(wù)器,所以就開始在網(wǎng)上查找具體解決方案,這才看到ELK,了解了他們之間的原理后,我就開始在測(cè)試環(huán)境部署,下面是我根據(jù)自己的理解畫的部署以及原理圖。

三:安裝環(huán)境
服務(wù)器系統(tǒng):Windows server 2012 r2
Elasticsearch版本:elasticsearch-7.7.0-windows-x86_64
Logstash版本:logstash-7.7.0
Kibana版本:kibana-7.7.0-windows-x86_64
(為了產(chǎn)生不必要的麻煩,最好這三個(gè)版本一致。官網(wǎng)下載比較慢,可以去華為開源鏡像站:https://mirrors.huaweicloud.com/ 下載)
四:安裝步驟
將Elasticsearch、Logstash和Kibana下載后,解壓。目錄不要帶中文。安裝順序:先安裝Elasticsearch,再安裝Logstash,最后安裝Kibana
1、Elasticsearch的安裝與配置
找到根目錄的config文件夾,elasticsearch.yml進(jìn)行編輯,直接添加以下內(nèi)容,或者你可以找到對(duì)應(yīng)的字段,將注釋放開。默認(rèn)是本機(jī)可以訪問,因?yàn)槲乙渌麅膳_(tái)也能給**Elasticsearch傳輸數(shù)據(jù),所以network.host我設(shè)置為 0.0.0.0。
node.name: nodes
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["nodes"]
到這里Elasticsearch的配置就已經(jīng)完工了,然后就是啟動(dòng),根目錄下bin文件下的elasticsearch.bat,以管理員身份運(yùn)行就可以啟動(dòng)elasticsearch,啟動(dòng)成功后瀏覽器訪問http://127.0.0.1:9200/,看到如下界面代表啟動(dòng)成功

2、Logstash的安裝與配置
首先說明,它主要負(fù)責(zé)讀取日志文件,然后傳輸給Elasticsearch,所以我們就要配置Logstash的輸入(input)和輸出(output),整個(gè)配置文件分為三部分:input,filter,output。下來我們就開始以這三個(gè)參數(shù)在實(shí)際應(yīng)用是如何配置的。在配置的前提,我們需要?jiǎng)?chuàng)建一個(gè)logstash.conf文件,創(chuàng)建地址為根目錄的confIg下面(或者復(fù)制logstash-sample.conf,進(jìn)行名稱修改)
a、input參數(shù)配置
input {
file {
type => "d_52"
start_position => "beginning"
path => "D:/_projectLog/projectWeb/debug.log"
codec => plain{charset=>"GBK"}
}
}
input {
file {
type => "e_52"
start_position => "beginning"
path => "D:/_projectLog/projectWeb/error.log"
codec => plain{charset=>"GBK"}
}
}
input的解釋說明:我寫了兩個(gè)input,因?yàn)槲乙褍蓚€(gè)日志文件分別輸出,所以這塊的配置是讀取多個(gè)文件。type:是我定義這個(gè)文件的類型,具體用途就是對(duì)應(yīng)指定的tag。start_position 檢查時(shí)間戳。path 監(jiān)聽文件路徑。codec 主要是防止亂碼,當(dāng)然input中有很多屬性,根據(jù)具體情況指定吧。
filter的解釋說明:作用是過濾匹配。我是為了過濾tag,在output中輸出到哪個(gè)索引中。
filter {
grok {
match => {
"message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}'
}
}
if[type] == "d_52" {
mutate {
add_tag => ["d_52"]
}
}
if [type] == "e_52" {
mutate {
add_tag => ["e_52"]
}
}
}
output的解釋說明:根據(jù)tag推送到具體elasticsearch 的索引庫(kù)中。
output {
if "d_52" in [tags] {
elasticsearch {
hosts => "http://elasticsearch的ip:9200"
index => "project_debug_log-%{+YYYY.MM.dd}"
codec => plain{charset=>"GBK"}
}
}
if "e_52" in [tags] {
elasticsearch {
hosts => "http://**elasticsearch的ip**:9200"
index => "project_error_log-%{+YYYY.MM.dd}"
codec => plain{charset=>"GBK"}
}
}
stdout {
codec => json_lines
}
}
到這里,配置文件就完成了,然后我們啟動(dòng),具體啟動(dòng)命令為logstash.bat -f ../config/logstash.conf(根目錄的bin下執(zhí)行),或者創(chuàng)建bat文件,把文件名改為bat,放在bin下,雙擊執(zhí)行,就可以看到控制臺(tái)讀取的數(shù)據(jù)內(nèi)容了。其他兩臺(tái)服務(wù)器,就只需要裝Logstash,配置文件改一下path路徑,type和tag也都改一下,標(biāo)記清除是哪個(gè)臺(tái)服務(wù)器的就行,為了在Kibana可以看到日志來源。
3、Kibana的安裝與配置
Kibana主要是讀取elasticsearch 的數(shù)據(jù),那我們就在配置文件中配置elasticsearch 的地址就可以了,具體操作如下:
Kibana的根目錄config下的kibana.yml文件,添加下列配置
server.port: 5601 #Kibana的訪問端口
server.host: X.X.X.X #Kibana的訪問ip(內(nèi)網(wǎng)ip),最好不要寫127.0.0.1或者localhost,其他服務(wù)器就不能訪問了
elasticsearch.hosts: http://elasticsearch的ip:9200
i18n.locale: "zh-CN" #設(shè)置為中文
Kibana也就配置完了,bin目錄啟動(dòng)kibana.bat,啟動(dòng)好了,瀏覽器訪問http://配置的ip:5601,就可以了。


按照指引創(chuàng)建成功后,看日志

整體沒有問題了,下來我們需要把Kibana和nginx結(jié)合起來,通過互聯(lián)網(wǎng)ip訪問。由于Kibana沒有登錄界面,我們就得借助nginx實(shí)現(xiàn)它的登錄,配置截圖如下

location / {
auth_basic "kibana login auth";
auth_basic_user_file D:/nginx/conf/passwd;# 存放密碼文件路徑
proxy_pass http://192.168.1.1:5601;# 轉(zhuǎn)發(fā)到 kibana
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
ok,外網(wǎng)訪問也沒有問題了。結(jié)束了兩天的探索,也是第一次接觸ELK,從了解到實(shí)踐,有點(diǎn)意思。