由于我們使用的服務(wù)器比較多耸弄,最近每次查看日志都是ssh登陸或者通過(guò)Fabric下載下來(lái)咧虎,特別不方便。經(jīng)過(guò)多方比較计呈,最終選擇了ELK砰诵。所以,開始了學(xué)習(xí)ELK的路程捌显。
本來(lái)茁彭,是打算寫一篇完整教程,后來(lái)想了想扶歪,發(fā)現(xiàn)完整教程中的一些內(nèi)容并不適合展現(xiàn)出來(lái)理肺。但,在學(xué)習(xí)過(guò)程中的內(nèi)容击罪,感覺還是需要做個(gè)筆記哲嘲。所以,暫時(shí)整一篇筆記媳禁,記錄在學(xué)習(xí)實(shí)踐過(guò)程中所有知識(shí)點(diǎn)眠副,后面在將整個(gè)日志系統(tǒng)搭建好整一篇完整的搭建教程】⒒回到正題囱怕,咱們開始學(xué)習(xí)ELK霍弹。
一、簡(jiǎn)單介紹ELK
ELK是Elasticsearch
娃弓、Logstash
典格、Kibana
三個(gè)開源軟件的首字母縮寫,在搭建ELK日志系統(tǒng)時(shí)台丛,除了前面三個(gè)耍缴,還有用到了Filebeat
,其中它們的功能作用如下:
- Elasticsearch:是一個(gè)搜索和分析引擎
- Logstash:是一個(gè)服務(wù)端的數(shù)據(jù)預(yù)處理管道挽霉,它可以同時(shí)收集防嗡、轉(zhuǎn)換多個(gè)數(shù)據(jù)源的數(shù)據(jù),并且發(fā)送給Elasticsearch
- Kibana:是一個(gè)Web平臺(tái)侠坎,將Elasticsearch的數(shù)據(jù)用表格和圖片的形式展現(xiàn)出來(lái)蚁趁,以供分析
- Filebeat: 是一個(gè)日志文件托運(yùn)工具,在服務(wù)器上安裝之后实胸,F(xiàn)ilebeat會(huì)監(jiān)控日志目錄或者指定的日志文件他嫡,追蹤讀取這些文件,將收集到的日志數(shù)據(jù)發(fā)送給Logstash庐完。(除了Logstash钢属,它也可以發(fā)送給Elasticsearch、Kafka假褪、Redis等)
二署咽、ELK架構(gòu)
ELK架構(gòu)分成兩種,一種是經(jīng)典的ELK生音,另外一種是加上消息隊(duì)列(Redis或Kafka或RabbitMQ)和Nginx的架構(gòu)。
經(jīng)典的ELK
經(jīng)典的ELK主要是由Filebeat + Logstash + Elasticsearch + Kibana組成窒升,如下圖:
它主要適用于數(shù)據(jù)量小的開發(fā)環(huán)境缀遍,存在丟失數(shù)據(jù)的危險(xiǎn)。
消息隊(duì)列+Nginx架構(gòu)
這種架構(gòu)饱须,主要加上了Redis或Kafka或RabbitMQ做消息隊(duì)列域醇,保證了消息的不丟失。而加上Nginx蓉媳,則是可以增加一層訪問(wèn)限制(因?yàn)镵ibana本身沒(méi)有限制譬挚,所以放在Nginx做),如下圖:
此種架構(gòu)酪呻,主要用在生成環(huán)境减宣,可以處理大數(shù)據(jù)量,并且不會(huì)丟失數(shù)據(jù)玩荠。
三漆腌、安裝ELK
安裝Java 8
由于Elasticsearch贼邓、Logstash是基于Java 8開發(fā)的,所以需要在安裝Elasticsearch闷尿、Logstash的服務(wù)器上安裝Java 8塑径。
$ apt-get update
$ apt-get install default-jre
$ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
APT安裝ELK源
我這里使用APT安裝的,所以需要先更新ELK源填具,然后就可以apt-get install
安裝ELK了统舀。需要注意的是,若是你的Logstash
和Filebeat
在不同的服務(wù)器上劳景,則ELK源需要在每臺(tái)服務(wù)器上安裝一遍誉简。當(dāng)然,若是你習(xí)慣另外方式枢泰,可以參考官網(wǎng)Installation進(jìn)行選擇描融。
首先,下載和安裝公鑰
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然后衡蚂,安裝apt-transport-https
包
sudo apt-get install apt-transport-https
之后窿克,將ELK的安裝包源保存到/etc/apt/sources.list.d/elastic-6.x.list
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
最后,更新下apt
sudo apt-get update
安裝Elasticsearch
我們上面已經(jīng)安裝過(guò)了ELK源毛甲,所以可以直接使用apt-get install
來(lái)安裝ELK這些軟件年叮。
1、安裝Elasticsearch
sudo apt-get install elasticsearch
2玻募、啟動(dòng)elasticsearch只损,并驗(yàn)證是否運(yùn)行
啟動(dòng)elasticsearch
service elasticsearch start
等一會(huì)兒,然后輸入curl http://localhost:9200
進(jìn)行驗(yàn)證
返回下面內(nèi)容七咧,則說(shuō)明運(yùn)行成功:
{
"name" : "qE-LiYD",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "pbVqoWBjR4ybbPXprKr5WQ",
"version" : {
"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
遇到問(wèn)題:剛搭建時(shí)跃惫,我在多臺(tái)服務(wù)器上實(shí)驗(yàn)過(guò),輸入curl http://localhost:9200
獲取不到任何內(nèi)容艾栋,啟動(dòng)也沒(méi)有報(bào)錯(cuò)信息爆存。后來(lái),在官方的Install Elasticsearch with Debian Package文檔中蝗砾,查看日志路徑先较,通過(guò)日志才發(fā)現(xiàn)是內(nèi)存不足。最后悼粮,換到一臺(tái)4G內(nèi)存的服務(wù)器上闲勺,就沒(méi)有問(wèn)題了。也可以通過(guò)/usr/share/elasticsearch/bin/elasticsearch
命令啟動(dòng)扣猫,當(dāng)報(bào)錯(cuò)時(shí)菜循,能在終端顯示錯(cuò)誤信息。
如果要停止或重啟elasticsearch苞笨,可以使用下面命令:
# 停止
service elasticsearch stop
# 重啟
service elasticsearch restart
安裝Logstash
已經(jīng)安裝好ELK源债朵,所以只需要一句命令安裝:
sudo apt-get install logstash
安裝Kibana
Kibana是JS寫的子眶,若是Kibana和Logstash、Elasticsearch在不同服務(wù)器上序芦,可以不安裝Java 8臭杰。
# 安裝Kibana
sudo apt-get install kibana
Kibana的配置文件在/etc/kibana/kibana.yml
中,它默認(rèn)打開的端口是5601
谚中,并默認(rèn)接收本地9200的elasticsearch數(shù)據(jù)渴杆。對(duì)應(yīng)的配置如下:
server.port: 5601
elasticsearch.url: "[http://localhost:9200](http://localhost:9200/)"
啟動(dòng)Kibana,使用如下命令:
sudo service kibana start
此時(shí)宪塔,若是將Kibana安裝本地磁奖,就可以通過(guò) http://localhost:5601看到如下頁(yè)面:
安裝Filebeat
首先安裝好ELK源,然后執(zhí)行下面命令安裝Filebeat
sudo apt-get install filebeat
四某筐、配置
在上面安裝比搭,Elasticsearch
和Kibana
使用默認(rèn)配置,重點(diǎn)的配置主要是Filebeat
南誊、Logstash
身诺。
Filebeat
Filebeat主要是追蹤日志數(shù)據(jù),然后將數(shù)據(jù)傳輸給Logstash或Redis(我這里選擇Redis做消息隊(duì)列)抄囚。
首先霉赡,需要配置追蹤和上傳的日志文件路徑,如下:
filebeat.prospectors:
- type: log
# 需要將開關(guān)打開
enabled: true
paths:
# 追蹤獲取/root/test.log中的內(nèi)容
- /root/test.log
當(dāng)將日志數(shù)據(jù)發(fā)送給Logstash
時(shí)幔托,如下設(shè)置:
output.logstash:
# 設(shè)置Logstash的hosts穴亏,若是有多個(gè),可以設(shè)置多個(gè)
hosts: ["localhost:5044"]
當(dāng)將日志數(shù)據(jù)發(fā)送給Redis時(shí)重挑,如下設(shè)置:
output.redis:
hosts: ["172.25.19.34:6379"] # host嗓化,主要需要帶上端口號(hào)
key: "test_log" #存儲(chǔ)在Redis中的隊(duì)列key,可以通過(guò)登錄Redis查看數(shù)據(jù)
password: "123456" # Redis的密碼
db: 0 # Redis的數(shù)據(jù)庫(kù)
timeout: 5 # Redis的超時(shí)時(shí)間
注意:當(dāng)Filebeat輸出到redis時(shí)谬哀,可以登錄數(shù)據(jù)蟆湖,通過(guò)llen
查看日志條數(shù)或通過(guò)lrange
查看日志具體數(shù)據(jù)。
啟動(dòng)Filebeat玻粪,使用如下命令:
/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"
當(dāng)如果已經(jīng)追蹤過(guò)了,還想重新測(cè)試诬垂,可以刪除以前的追蹤記錄劲室,命令如下:
rm /usr/share/filebeat/bin/data/registry
Logstash
Logstash主要是收集多個(gè)數(shù)據(jù)源的數(shù)據(jù),然后預(yù)處理一下结窘,最后丟給Elasticsearch做分析很洋。整個(gè)過(guò)程,Logstash就像一個(gè)管道一樣隧枫,如下圖:
其中喉磁,在Logstash中包括三部分內(nèi)容:
- inputs: 輸入
- filters: 過(guò)濾
- outputs: 輸出
上面三部分內(nèi)容谓苟,也是我們需要進(jìn)行配置的。
首先协怒,我們來(lái)體驗(yàn)一下最簡(jiǎn)單的配置涝焙,也就是標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出。
配置在first.conf文件內(nèi)孕暇,配置內(nèi)容如下:
input {
stdin {}
}
output {
stdout {}
}
運(yùn)行配置文件仑撞,命令如下:
/usr/share/logstash/bin/logstash -f first.conf
輸入test,然后輸出了一個(gè)json格式數(shù)據(jù)妖滔,結(jié)果如下:
[INFO ] 2018-06-04 01:25:36.217 [Ruby-0-Thread-1: /usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/stud-0.0.23/lib/stud/task.rb:22] agent - Pipelines running {:count=>1, :pipelines=>["main"]}
test
{
"@version" => "1",
"@timestamp" => 2018-06-03T17:25:51.126Z,
"host" => "0.0.0.0",
"message" => "test"
}
然后隧哮,我們讓Logstash接收Filebeat直接傳送過(guò)來(lái)的數(shù)據(jù)
Filebeat中的配置如下:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /root/test.log
output.logstash:
hosts: ["localhost:5044"]
啟動(dòng)filebeat
/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"
配置在first-pipeline.conf
文件中,主要監(jiān)聽5044端口的數(shù)據(jù)
座舍,配置內(nèi)容如下:
input {
beats {
# 監(jiān)聽5044
port => "5044"
}
}
output {
stdout {}
}
測(cè)試logstash的配置文件沮翔,然后啟動(dòng)logstash
# 測(cè)試
/usr/share/logstash/bin/logstash -f first-pipeline.conf --config.test_and_exit
# 啟動(dòng),當(dāng)配置修改時(shí)曲秉,會(huì)自動(dòng)刷新采蚀,不用重新啟動(dòng)
/usr/share/logstash/bin/logstash -f first-pipeline.conf --config.reload.automatic
此時(shí),F(xiàn)ilebeat中獲取的日志文件岸浑,會(huì)傳送到Logstash顯示在終端搏存。注意,防止看不到效果矢洲,先啟動(dòng)Logstash璧眠,然后啟動(dòng)Filebeat。
最后读虏,我們?cè)倏纯词褂肦edis時(shí)责静,是如何存取數(shù)據(jù)的
在Filebeat端,配置如下:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /root/test.log
output.redis:
hosts: ["172.25.19.34:6379"] # host盖桥,主要需要帶上端口號(hào)
key: "test_log" #存儲(chǔ)在Redis中的隊(duì)列key灾螃,可以通過(guò)登錄Redis查看數(shù)據(jù)
password: "123456" # Redis的密碼
db: 0 # Redis的數(shù)據(jù)庫(kù)
timeout: 5 # Redis的超時(shí)時(shí)間
啟動(dòng)Filebeat
/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"
在Logstash端,配置如下:
input {
redis {
port => "6379"
host => "172.25.19.34"
data_type => "list" # 數(shù)據(jù)類型為隊(duì)列
type => "log"
key => "test_log" # 存儲(chǔ)Redis的key
password => "123456"
db => 0
timeout => 5
}
}
output {
stdout {
codec => rubydebug
}
}
這樣就能夠使用Filebeat將數(shù)據(jù)存入Redis揩徊,而另外一端Logstash從Redis中獲取數(shù)據(jù)腰鬼。
將數(shù)據(jù)輸出到Elasticsearch
前面,我們只是將數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出來(lái)顯示數(shù)據(jù)塑荒,生產(chǎn)環(huán)境中我們需要把數(shù)據(jù)輸出到Elasticsearch熄赡,配置如下:
output {
elasticsearch {
# localhost對(duì)應(yīng)安裝elasticsearch的服務(wù)器
hosts => ["localhost:9200"]
}
}
還有,Logstash過(guò)濾器
前面齿税,我們用到了Logstash的input和output彼硫,并沒(méi)有用到filter(過(guò)濾器)。過(guò)濾器中,會(huì)用到許多插件拧篮,暫時(shí)我就用過(guò)grok
词渤,配置如下:
filter {
grok {
match => {"message" => "%{IP:client_ip} %{WORD:method} %{URIPATHPARAM:request} %{GREEDYDATA:content}"}
}
}
當(dāng)在Logstash中加入上面filter配置時(shí),它就會(huì)進(jìn)行匹配串绩,上面匹配的是: ip 方法 請(qǐng)求參數(shù) 請(qǐng)求內(nèi)容
缺虐。
例如:
55.3.244.1 GET /index.html 測(cè)試11
test GET /index.html 測(cè)試22
第一句能匹配,第二句就不能匹配赏参。
上面配置文件中的IP
志笼、WORD
、URIPATHPARAM
把篓、GREEDYDATA
是內(nèi)置支持的正則表達(dá)式別名纫溃,具體支持的正則表達(dá)式可查看logstash-patterns-core。
而若是匹配之后韧掩,就會(huì)在輸出內(nèi)容紊浩,添加client_ip
、method
疗锐、request
和content
坊谁。等于就是通過(guò)正則表達(dá)式非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)化成結(jié)構(gòu)化數(shù)據(jù)。
上面兩句話滑臊,被Filebeat抓取之后口芍,在Logstash的終端展示內(nèi)容:
{
"@version" => "1",
"content" => "測(cè)試11",
"offset" => 36,
"message" => "55.3.244.1 GET /index.html 測(cè)試11",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"@timestamp" => 2018-06-03T18:10:03.376Z,
"request" => "/index.html",
"beat" => {
"hostname" => "iZ0xi4n3ya19j63huy3c78Z",
"version" => "6.2.4",
"name" => "test"
},
"source" => "/root/elk_conf/test.txt",
"prospector" => {
"type" => "log"
},
"host" => "iZ0xi4n3ya19j63huy3c78Z",
"method" => "GET",
"client_ip" => "55.3.244.1"
}
{
"@timestamp" => 2018-06-03T18:10:03.376Z,
"source" => "/root/elk_conf/test.txt",
"@version" => "1",
"beat" => {
"hostname" => "iZ0xi4n3ya19j63huy3c78Z",
"version" => "6.2.4",
"name" => "test"
},
"prospector" => {
"type" => "log"
},
"host" => "iZ0xi4n3ya19j63huy3c78Z",
"offset" => 66,
"message" => "test GET /index.html 測(cè)試22",
"tags" => [
[0] "beats_input_codec_plain_applied",
[1] "_grokparsefailure"
]
}
可看到第一句話匹配了,添加了對(duì)應(yīng)的字段雇卷。而第二句話沒(méi)有匹配鬓椭,tags
中多了_grokparsefailure
。
而最終关划,在Kibana
上顯示的結(jié)果如下:
參考
Installing ELK
Logstash安裝搭建(一)
A Filebeat Tutorial: Getting Started
Parsing Logs with Logstash
Filebeat小染,Redis和ELK6.x集中式日志解決方案
logstash-patterns-core