1. 程式人生 > >filebeat + kafka + logstash + Elasticsearch + Kibana日誌收集系統搭建

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

是一個完全開源的工具,它可以對你的日誌進行收集、過濾、分析,支援大量的資料獲取方法,並將其儲存供以後使用(如搜尋)。說到搜尋,logstash帶有一個web介面,搜尋和展示所有日誌。一般工作方式為c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。
      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 即可

訪問http://localhost:5601/

Kibana的使用參考這篇文章     https://www.cnblogs.com/cjsblog/p/9476813.html