filebeat + kafka + logstash + Elasticsearch + Kibana日誌收集系統搭建
一、介紹
在日常運維工作中,對於系統和業務日誌的處理尤為重要。今天,在這裡分享一下自己部署的filebeat + kafka + ELK開源實時日誌分析平臺的記錄過程。
1、ELK介紹
開源實時日誌分析ELK平臺能夠完美的解決我們上述的問題,ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成:
1)ElasticSearch是一個基於Lucene的開源分散式搜尋伺服器。它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是第二流行的企業搜尋引擎。設計用於雲端計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。
在elasticsearch中,所有節點的資料是均等的。
2)Logstash
3)Kibana 是一個基於瀏覽器頁面的Elasticsearch前端展示工具,也是一個開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助您彙總、分析和搜尋重要資料日誌。
2、為什麼要採用filebeat
Logstash是一個功能強大的日誌服務,不過會佔用較多的系統資源,filebeat作為一個輕量級的日誌服務,具有以下特點:
1)健壯,從沒錯過任何一個細節
在讀取和轉發日誌行的過程中,如果被中斷,Filebeat會記錄中斷的位置。並且,當重新聯機時,Filebeat會從中斷的位置開始。
2)它不會讓你超負荷工作
當傳送資料到Logstash或Elasticsearch時,Filebeat使用一個反壓力敏感(backpressure-sensitive)
的協議來解釋高負荷的資料量。當Logstash資料處理繁忙時,Filebeat放慢它的讀取速度。一旦壓力解除,Filebeat將恢復到原來的速度,繼續傳輸資料。
3)使簡單的事情保持簡單
Filebeat附帶了內部模組(auditd、Apache、Nginx、System和MySQL),這些模組簡化了普通日誌格式的聚集、解析和視覺化。結合使用基於作業系統的自動預設設定,使用Elasticsearch Ingest Node的管道定義,以及Kibana儀表盤來實現這一點。
3、使用kafka
使用kafka,有著降低系統耦合度,緩衝訊息,提高吞吐方面的作用,並且使系統的擴充套件變得很容易。
二、部署過程
1、系統環境:2臺windows電腦 IP為192.168.1.104和192.168.1.108
2臺centos為虛擬機器 IP為192.168.1.223和192.168.1.184
各個服務版本為
filebeat-5.5.1-windows-x86_64.zip
filebeat-5.5.1-x86_64.rpm
kafka_2.11-2.1.0.tgz
elasticsearch-6.5.2.zip
kibana-6.5.2-windows-x86_64.zip
logstash-6.5.3.tar.gz
2、filebeat安裝
filebeat會與待收集日誌的服務安裝在同一個電腦中,因此我這裡在centos7(虛擬機器)和windows上都安裝了filebeat,這裡的windows的版本原來採用的是最新的filebeat-6.5.3-windows-x86_64,不過執行一直存在問題,沒有辦法正常輸出,後來採用了filebeat-5.5.1-windows-x86_64版本就可以了,目前還不知道為什麼。
2.1 centos7系統安裝
系統版本:Centos7
filebeat版本:5.5.1。
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.5.1-x86_64.rpm
安裝命令
rpm -Uvh filebeat-5.5.1-x86_64.rpm
配置檔案路徑
/etc/filebeat/filebeat.yml
日誌檔案路徑
/var/log/filebeat
注意 每次新啟動都會生成一個新的filebeat,上次啟動的會被mv為filebeat.1
啟動/停止/重啟命令
systemctl start filebeat
systemctl stop filebeat
systemctl restart filebeat
配置檔案如下
這個是針對日誌比較規範不需要進行處理的配置檔案
#用來設定獲取日誌的路徑
paths:
- /var/log/messages
#增加logtype型別用來區別不同型別的日誌
fields:
logtype: syslog
#輸出到kafka
output.kafka:
enable: true
hosts: ["192.168.1.223:9092"]
topic: 'test'
在另外一臺centos上收集的日誌格式為多行,具體格式如下:
2018-12-20 14:47:10.430 [debug] <0.15718.7>@ejabberd_receiver:process_data:284 Received XML on stream = <<" ">>
2018-12-20 14:47:10.430 [debug] <0.15718.7>@shaper:update:120 State: {maxrate,50000,98.93329752244526,1545288424304923}, Size=1
M=0.010009903127242583, I=6125.801
2018-12-20 14:47:14.349 [debug] <0.15718.7>@ejabberd_receiver:process_data:284 Received XML on stream = <<"<iq id=\"3030\" type=\"set\" to=\"[email protected]/camera\" from=\"[email protected]\"><intamacstream xmlns=\"intamac:intamacstream\" ip=\"192.168.1.233\" port=\"5118\" type=\"start\" timeout=\"0\" quality=\"main\" /></iq>">>
2018-12-20 14:47:14.349 [debug] <0.15718.7>@shaper:update:120 State: {maxrate,50000,49.54826964755036,1545288430430806}, Size=219
M=2.191085645023605, I=3918.931
2018-12-20 14:47:14.350 [debug] <0.15719.7>@ejabberd_router:do_route:351 route
from {jid,<<"user">>,<<"component.use-xmpp-01">>,<<>>,<<"user">>,<<"component.use-xmpp-01">>,<<>>}
to {jid,<<"bc51fe82fa07">>,<<"use-xmpp-01">>,<<"camera">>,<<"bc51fe82fa07">>,<<"use-xmpp-01">>,<<"camera">>}
packet {xmlel,<<"iq">>,[{<<"id">>,<<"3030">>},{<<"type">>,<<"set">>},{<<"to">>,<<"[email protected]/camera">>},{<<"from">>,<<"[email protected]">>}],[{xmlel,<<"intamacstream">>,[{<<"xmlns">>,<<"intamac:intamacstream">>},{<<"ip">>,<<"192.168.1.233">>},{<<"port">>,<<"5118">>},{<<"type">>,<<"start">>},{<<"timeout">>,<<"0">>},{<<"quality">>,<<"main">>}],[]}]}
這樣的日誌如果不經過處理,會儲存多條日誌,針對這樣型別的日誌可採用下面的配置進行篩選和拼接:
配置的規則可以參考filebeat.yml(中文配置詳解)
paths:
- /opt/ejabberd-16.09/logs/ejabberd.log
fields:
logtype: ejabberdlog
#正則表示式判斷開頭,這裡只是一個比較簡單的判斷
multiline.pattern: '^\s*(20[012]\d-[01]\d-[0123]\d\s\d\d:\d\d:\d\d.\d\d\d)'
# 是否需要對pattern條件轉置使用,不翻轉設為true,反轉設定為false。
multiline.negate: true
# 匹配pattern後,與前面(before)還是後面(after)的內容合併為一條日誌
multiline.match: after
正則表示式有網站來進行驗證,使用方便^_^ 正則表示式網站
2.2 windows系統安裝
下載地址:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.5.1-windows-x86_64.zip
配置檔案filebeat.yml,配置內容與centos版本的類似,唯一不同的path地址
paths:
#linux和windows的路徑不一樣的 反斜槓不一樣/ \
#- /var/log/*.log
- d:\logs\wowzastreamingengine_access.log
#windows版本直接輸出到Logstash 測試另外一種輸出方式
output.logstash:
# The Logstash hosts
enabled: true
hosts: ["192.168.1.223:5044"]
通過cmd啟動
filebeat.exe -c -e filebeat.yml
執行以後如下:
3、Elasticsearch 安裝
Elasticsearch 安裝見這篇文章Windows環境下安裝ElasticSearch以及head外掛
在測試環境Elasticsearch安裝在2臺window電腦上
4、kafka安裝
kafka基於zookeeper,所以這裡需要首先安裝zookeeper
4.1 安裝zookeeper
zookeeper使用的版本是zookeeper-3.4.13 下載地址
解壓tar -zvxf zookeeper-3.4.13.tar.gz 這裡沒有實現叢集,只使用單機版本
配置檔案存放在/conf/目錄下,將zoo_sample.cfd檔名稱改為zoo.cfg, 採用預設的配置
進入bin檔案直接執行
./zkServer.sh start #啟動
[[email protected] bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/zjs/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
netstat -tunlp|grep 2181 #檢視zookeeper埠
/home/zjs/zookeeper-3.4.13/bin
[[email protected] bin]# netstat -tunlp|grep 2181
tcp6 0 0 :::2181 :::* LISTEN 14134/java
./zkServer.sh stop #停止
4.2 安裝執行kafka
kafka安裝在centos虛擬機器192.168.1.223上 下載地址
這裡安裝的是kafka_2.11-2.1.0.tgz直接解壓 tar -zvxf kafka_2.11-2.1.0.tgz
進入kafka目錄,敲入命令 bin/kafka-server-start.sh config/server.properties &
檢測2181與9092埠
[[email protected] kafka_2.11-2.1.0]# netstat -tunlp|egrep "(2181|9092)"
tcp6 0 0 :::9092 :::* LISTEN 36841/java
tcp6 0 0 :::2181 :::* LISTEN 32390/java
建立topic名稱為test
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
顯示所有topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
[[email protected] kafka_2.11-2.1.0]# bin/kafka-topics.sh --list --zookeeper localhost:2181
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
__consumer_offsets
test
test222
test888
5、logstash配置以及安裝
logstash安裝在centos虛擬機器192.168.1.223上面,下載後直接解壓
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.3.tar.gz
tar zvxf logstash-6.5.3.tar.gz
5.1 配置檔案
配置檔案需要自己寫,可參考config裡面的logstash-sample.conf,或者直接訪問官方的文件
#輸入為kafka,topics是test,查詢時間是1秒
input {
kafka {
enable_auto_commit => true
auto_commit_interval_ms => "1000"
codec => "json"
bootstrap_servers => "192.168.1.223:9092"
topics => ["test"]
}
# beats {
# port => 5044
# }
}
#stdout{ codec=>rubydebug}用來除錯使用,執行時會輸出到螢幕,除錯完成註釋掉
#在filebeat裡面我們定義了fields的logtype,在這裡可以用來區別不同的日誌
#index為ES的資料庫index名
output {
stdout{ codec=>rubydebug}
if [fields][logtype] == "syslog"{
elasticsearch {
hosts => ["192.168.1.108:9200"]
index => "zjslog-%{+YYYY.MM.dd}"
}
}
if [fields][logtype] == "ejabberdlog"{
elasticsearch {
hosts => ["192.168.1.108:9200"]
index => "ejabberdlog-%{+YYYY.MM.dd}"
}
}
}
5.2 執行logstash
./logstash -f file.conf file.conf放在logstash相同目錄中
可以看出前三條都是定義了fields的logtype的,filebeat通過kafka到logstash,最後一條沒有定義的是來自windows的filebeat,沒有經過kafka,直接到logstash,也沒有定義fields的logtype
{
"source" => "/opt/ejabberd-16.09/logs/ejabberd.log",
"beat" => {
"hostname" => "testhcl.szinfinova.com",
"version" => "5.5.1",
"name" => "testhcl.szinfinova.com"
},
"type" => "log",
"input_type" => "log",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"@version" => "1",
"@timestamp" => 2018-12-21T02:37:55.664Z,
"host" => "testhcl.szinfinova.com",
"fields" => {
"logtype" => "ejabberdlog"
},
"message" => "2018-12-21 10:29:47.059 [debug] <0.26871.7>@ejabberd_router_multicast:do_route:211 route_multicast\n\tfrom [email protected]/smarthub\n\tdomain use-xmpp-01\n\tdestinations [<<\"[email protected]\">>,<<\"[email protected]\">>]\n\tpacket {xmlel,<<\"presence\">>,[{<<\"id\">>,<<\"2\">>}],[]}",
"offset" => 59572
}
{
"source" => "/opt/ejabberd-16.09/logs/ejabberd.log",
"beat" => {
"hostname" => "testhcl.szinfinova.com",
"name" => "testhcl.szinfinova.com",
"version" => "5.5.1"
},
"type" => "log",
"input_type" => "log",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"@version" => "1",
"@timestamp" => 2018-12-21T02:37:55.664Z,
"host" => "testhcl.szinfinova.com",
"fields" => {
"logtype" => "ejabberdlog"
},
"message" => "2018-12-21 10:29:47.059 [debug] <0.26871.7>@ejabberd_router:do_route:351 route\n\tfrom {jid,<<\"6ceceba257fb\">>,<<\"use-xmpp-01\">>,<<\"smarthub\">>,<<\"6ceceba257fb\">>,<<\"use-xmpp-01\">>,<<\"smarthub\">>}\n\tto {jid,<<\"6ceceba257fb\">>,<<\"use-xmpp-01\">>,<<>>,<<\"6ceceba257fb\">>,<<\"use-xmpp-01\">>,<<>>}\n\tpacket {xmlel,<<\"presence\">>,[{<<\"id\">>,<<\"2\">>}],[]}",
"offset" => 59916
}
{
"source" => "/var/log/messages",
"beat" => {
"hostname" => "slave.szinfinova.com",
"name" => "slave.szinfinova.com",
"version" => "5.5.1"
},
"type" => "log",
"fields" => {
"logtype" => "syslog"
},
"input_type" => "log",
"message" => "Dec 21 10:46:19 slave systemd: Starting filebeat...",
"offset" => 102668,
"@version" => "1",
"@timestamp" => 2018-12-21T02:46:19.321Z
}
{
"source" => "d:\\logs\\wowzastreamingengine_access.log",
"beat" => {
"hostname" => "march020-PC",
"version" => "5.5.1",
"name" => "march020-PC"
},
"type" => "log",
"host" => "march020-PC",
"input_type" => "log",
"tags" => [
[0] "beats_input_codec_plain_applied"
],
"message" => "2018-12-06\t10:28:15\tCST\tcomment\tserver\tWARN\t200\t-\tDvrStreamStoreBase.changeCurrentTime[live/_definst_/30bc51fe82fa07.sdp/30bc51fe82fa07.sdp.0] : Current DVR time tried to move backwards. Ignored new time. Old time=750600372. New time=730103355.\t-\t-\t-\t832795.109\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-\t-",
"@version" => "1",
"offset" => 130293,
"@timestamp" => 2018-12-21T02:50:08.983Z
}
通過ES head檢視日誌
6、Kibana安裝配置
Kibana安裝在windows 192.168.1.104機子上,下載的版本是kibana-6.5.2-windows-x86_64, 下載地址
下載後解壓,配置檔案在config下面kibana.yml,只需配置ES的ip即可
elasticsearch.url: "http://192.168.1.108:9200"
直接在cmd命令列中執行,kibana.bat 即可
Kibana的使用參考這篇文章 https://www.cnblogs.com/cjsblog/p/9476813.html