ELK分布式日志收集系統(tǒng)介紹
1.ElasticSearch是一個(gè)基于Lucene的開源分布式搜索服務(wù)器。它的特點(diǎn)有:分布式,零配置,自動(dòng)發(fā)現(xiàn),索引自動(dòng)分片,索引副本機(jī)制,restful風(fēng)格接口,多數(shù)據(jù)源,自動(dòng)搜索負(fù)載等。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是第二流行的企業(yè)搜索引擎。設(shè)計(jì)用于云計(jì)算中,能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定,可靠,快速,安裝使用方便。
2.Logstash是一個(gè)完全開源的工具,它可以對(duì)你的日志進(jìn)行收集、過濾、分析,支持大量的數(shù)據(jù)獲取方法,并將其存儲(chǔ)供以后使用(如搜索)。說到搜索,logstash帶有一個(gè)web界面,搜索和展示所有日志。一般工作方式為c/s架構(gòu),client端安裝在需要收集日志的主機(jī)上,server端負(fù)責(zé)將收到的各節(jié)點(diǎn)日志進(jìn)行過濾、修改等操作在一并發(fā)往elasticsearch上去。
3.Kibana是一個(gè)基于瀏覽器頁面的Elasticsearch前端展示工具,也是一個(gè)開源和免費(fèi)的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數(shù)據(jù)日志。
為什么要使用ELK
在傳統(tǒng)項(xiàng)目中,如果在生產(chǎn)環(huán)境上,將項(xiàng)目部署在多臺(tái)服務(wù)器上進(jìn)行集群,如果生產(chǎn)環(huán)境需要通過日志定位到BUG的話,需要在每臺(tái)服務(wù)器節(jié)點(diǎn)上使用傳統(tǒng)的命令方式查詢,這樣的查詢是非常低效,且非常考驗(yàn)人的忍耐力的,而ELK恰恰就幫助我們解決這樣的問題
ELK的工作原理
1.在集群環(huán)境中,每一個(gè)實(shí)例節(jié)點(diǎn)都進(jìn)行安裝Logstash插件
2.每個(gè)服務(wù)器節(jié)點(diǎn),都會(huì)將自身的本地日志文件輸入到Logstash中
3.Logstash獲取日志文件后格式化為json格式,根據(jù)每天創(chuàng)建不同的索引,輸出到ES服務(wù)中進(jìn)行存放
4.以圖形化界面進(jìn)行展示,搜索日志
Logstash介紹
Logstash是一個(gè)完全開源的工具,它可以對(duì)你的日志進(jìn)行收集、過濾、分析,支持大量的數(shù)據(jù)獲取方法,并將其存儲(chǔ)供以后使用(如搜索)。說到搜索,logstash帶有一個(gè)web界面,搜索和展示所有日志。一般工作方式為c/s架構(gòu),client端安裝在需要收集日志的主機(jī)上,server端負(fù)責(zé)將收到的各節(jié)點(diǎn)日志進(jìn)行過濾、修改等操作在一并發(fā)往elasticsearch上去。
核心流程:Logstash事件處理有三個(gè)階段:inputs → filters → outputs。是一個(gè)接收,處理,轉(zhuǎn)發(fā)日志的工具。支持系統(tǒng)日志,webserver日志,錯(cuò)誤日志,應(yīng)用日志,總之包括所有可以拋出來的日志類型。
Logstash工作原理
簡(jiǎn)單來說
1.本地?cái)?shù)據(jù)文件輸入到logstash中
2.logstash過濾些不要的數(shù)據(jù),然后將數(shù)據(jù)轉(zhuǎn)成指定的格式
3.輸出到指定的數(shù)據(jù)源中
前提準(zhǔn)備:
1.ES+kibana+logstash 一臺(tái)虛擬機(jī)配置運(yùn)行內(nèi)存3G,由于本人電腦資源有限開了2臺(tái)
共6個(gè)G
一、安裝jdk
1.安裝之前先檢查一下系統(tǒng)有沒有自帶open-jdk
命令:
rpm -qa |grep java
rpm -qa |grep jdk
rpm -qa |grep gcj
如果沒有輸入信息表示沒有安裝。
如果安裝可以使用rpm -qa | grep java | xargs rpm -e --nodeps 批量卸載所有帶有Java的文件 這句命令的關(guān)鍵字是java
2.首先檢索包含java的列表
yum list java*
3.檢索1.8的列表
yum list java-1.8*
4.安裝1.8.0的所有文件
yum install java-1.8.0-openjdk* -y
5.使用命令檢查是否安裝成功
java -version
二、集群環(huán)境下基于docker安裝es和kibana
啟動(dòng)兩個(gè)虛擬機(jī) 分別在不同的虛擬機(jī)啟動(dòng)es容器和kibana
啟動(dòng)虛擬機(jī)1,es名稱為:es1
下載es 和 kibana
docker pull elasticsearch:6.7.2
docker pull kibana:6.7.2
運(yùn)行容器
docker run -it --name es1 -d -p 9200:9200 -p 9300:9300 -p 5601:5601 elasticsearch:6.7.2
docker run -it -d -e ELASTICSEARCH_URL=http://127.0.0.1:9200 --name kibana --network=container:es1 kibana:6.7.2
啟動(dòng)虛擬機(jī)2,es名稱為:es2
下載es 和 kibana
docker pull elasticsearch:6.7.2
docker pull kibana:6.7.2
運(yùn)行容器
docker run -it --name es2 -d -p 9200:9200 -p 9300:9300 -p 5601:5601 elasticsearch:6.7.2
docker run -it -d -e ELASTICSEARCH_URL=http://127.0.0.1:9200 --name kibana --network=container:es2 kibana:6.7.2
如果在啟動(dòng)的ES過程中,報(bào)如下錯(cuò)誤
解決方案:
分配給ES的內(nèi)存太小了
1.進(jìn)入etc目錄,編輯sysctl.conf文件:
vi /etc/sysctl.conf
2.添加配置:
vm.max_map_count=262144 或者 655360
3.執(zhí)行:
sysctl -p
重啟服務(wù)器
三、配置ES集群
進(jìn)入容器修改集群配置服務(wù)器1
#進(jìn)入容器
docker exec -it 容器ID /bin/bash
#編輯配置文件
vi /usr/share/elasticsearch/config/elasticsearch.yml
#注釋掉原有的配置 添加配置
cluster.name: elasticsearch-cluster
node.name: es-node1
network.bind_host: 0.0.0.0
network.publish_host: 192.168.137.8
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.137.8:9300","192.168.137.9:9300"]
discovery.zen.minimum_master_nodes: 2
#保存退出
#退出容器
exit
進(jìn)入容器修改集群配置服務(wù)器2
#進(jìn)入容器
docker exec -it 容器ID /bin/bash
#編輯配置文件
vi /usr/share/elasticsearch/config/elasticsearch.yml
#注釋掉原有的配置 添加配置
cluster.name: elasticsearch-cluster
node.name: es-node2
network.bind_host: 0.0.0.0
network.publish_host: 192.168.137.9
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.137.8:9300","192.168.137.9:9300"]
discovery.zen.minimum_master_nodes: 2
#保存退出
#退出容器
exit
最后重啟兩個(gè)服務(wù)器docker里面的es,讓配置進(jìn)行生效
docker restart 容器id
網(wǎng)頁訪問集群的兩臺(tái)es,可以發(fā)現(xiàn)es配置已經(jīng)生效了
但是這樣還并不能確定是否成功集群,訪問如下ES集群其中任何IP地址即可
http://192.168.137.8:9200/_cat/nodes?pretty
如下圖,就代表es集群成功搭建
四、下載logstash源碼包
需要注意:每臺(tái)服務(wù)器上都需要安裝logstash,如下面操作,我這里只示例一個(gè)
因?yàn)榧合旅總€(gè)服務(wù)器都會(huì)有日志,所以每個(gè)服務(wù)都需要安裝logstash去收集日志發(fā)到es中
下載源碼包
官方地址
https://www.elastic.co/cn/downloads/logstash
國(guó)內(nèi)加速下載網(wǎng)址
https://www.newbe.pro/Mirrors/Mirrors-Logstash/
下載地址
wget https://mirrors.huaweicloud.com/logstash/6.7.2/logstash-6.7.2.zip
下載zip命令解壓
yum -y install zip
解壓
unzip logstash-6.7.2.zip
修改配置文件
進(jìn)入到logstash/config目錄
#新建sunny_log.conf文件
vim sunny_log.conf
#添加配置文件
input {
# 從文件讀取日志信息 輸送到控制臺(tái)
file {
path => "/usr/local/software/my/logs/eureka_all_2020-06-30_0.log"
codec => "json" ## 以JSON格式讀取日志
type => "elasticsearch"
start_position => "beginning"
}
}
# filter {
#
# }
output {
# 標(biāo)準(zhǔn)輸出
# stdout {}
# 輸出進(jìn)行格式化,采用Ruby庫(kù)來解析日志
stdout { codec => rubydebug }
elasticsearch {
hosts => ["192.168.137.8:9200","192.168.137.9:9200"]
index => "es-%{+YYYY.MM.dd}"
}
}
#保存
添加完配置后,進(jìn)入logstash/bin目錄下,啟動(dòng)logstash
./logstash -f ../config/sunny_log.conf
啟動(dòng)成功
五、通過kibana查看日志
以上的配置是讀取一個(gè)日志文件,那如果需要讀取多個(gè)日志文件該怎么辦呢?
很簡(jiǎn)單,我們稍微改動(dòng)配置文件即可
讀取logs目錄下,所有以log結(jié)尾的文件,都輸出到es中
可能又會(huì)有人疑惑,我能否同步多個(gè)目錄呢
假如logs下有兩個(gè)目錄,每個(gè)目錄不同的日志文件
/:代表logs下所有目錄都匹配
//*.log:代表logs下匹配所有目錄下的目錄里面的log文件