1. 程式人生 > >【ELK筆記】ELK的安裝,快速搭建一個ELK日誌分析平臺

【ELK筆記】ELK的安裝,快速搭建一個ELK日誌分析平臺

ELK 是 ElasticSearch、 LogStash、 Kibana 三個開源工具的簡稱,現在還包括 Beats,其分工如下:

  • LogStash/Beats: 負責資料的收集與處理
  • ElasticSearch: 一個開源的分散式搜尋引擎,負責資料的儲存、檢索和分析
  • Kibana: 提供了視覺化的介面。負責資料的視覺化操作

基於 ELK Stack 可以構建日誌分析平臺、資料分析搜尋平臺等非常有用的專案。

作為學習筆記的第一篇,簡單介紹下 ELK 各個軟體的安裝與簡單配置,快速的搭建一個日誌的查詢平臺

一. ElasticSearch 的安裝與執行

ES 是一個基於 Lucene 的使用 Java 開發的開源搜尋引擎,因此其執行是基於 JVM 的,因此在安裝之前需要保證已經安裝了 Java 環境。ES 要求使用 Java8 或者更高版本的 Java 環境。

確定機器已經安裝了 Java 環境後,就可以安裝 ES 了。官網提供了壓縮包可以直接下載,

# 下載壓縮包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.tar.gz
# 解壓
tar -xzf elasticsearch-6.2.2.tar.gz
# 進入檔案
cd elasticsearch-6.2.2/

下載解壓完成後進入目錄,啟動命令在 bin 目錄下,直接執行命令就可以啟動了

bin/elasticsearch

ElasticSearch 的預設啟動埠是 9200。手動訪問出現如下資訊說明啟動成功。

這裡寫圖片描述

二. FileBeats 與 LogStash 的安裝

LogStash 可以用來對日誌進行收集並進行過濾整理後輸出到 ES 中,FileBeats 是一個更加輕量級的日誌收集工具。
現在最常用的方式是通過 FileBeats 收集目標日誌,然後統一輸出到 LogStash 做進一步的過濾,在由 LogStash 輸出到 ES 中進行儲存。

1. LogStash 的安裝執行

tar zxvf logstash-6.2.2.tar.gz
# 進入目錄
cd logstash-6.2.2

LogStash 的執行需要指定一個配置檔案,來指定資料的流向,我們在當前目錄下建立一個 first.conf 檔案,其內容如下:

# 配置輸入為 beats
input {
    beats {
            port => "5044"

    }

}
# 資料過濾
filter {
    grok {
            match => { "message" => "%{COMBINEDAPACHELOG}" }

    }
    geoip {
            source => "clientip"

    }

}
# 輸出到本機的 ES
output {
    elasticsearch {
            hosts => [ "localhost:9200"  ]

    }

}

上面配置了 LogStash 輸出日誌到 ES 中,具體欄位在後面的筆記中會詳細介紹,這裡先用起來再說。
配置完成後就可以通過如下方式啟動 LogStash 了

bin/logstash -f first.conf --config.reload.automatic

可以看到命令列會打印出如下資訊, 可以看到 LogStash 預設埠為 5044:

[2018-03-08T23:12:44,087][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2018-03-08T23:12:44,925][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"6.2.2"}
[2018-03-08T23:12:45,623][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
[2018-03-08T23:12:49,960][INFO ][logstash.pipeline        ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2018-03-08T23:12:50,882][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
[2018-03-08T23:12:50,894][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://localhost:9200/, :path=>"/"}
[2018-03-08T23:12:51,303][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>"http://localhost:9200/"}
[2018-03-08T23:12:51,595][INFO ][logstash.outputs.elasticsearch] ES Output version determined {:es_version=>nil}
[2018-03-08T23:12:51,604][WARN ][logstash.outputs.elasticsearch] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>6}
[2018-03-08T23:12:51,641][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil}
[2018-03-08T23:12:51,676][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}}
[2018-03-08T23:12:51,773][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//localhost:9200"]}
[2018-03-08T23:12:52,176][INFO ][logstash.filters.geoip   ] Using geoip database {:path=>"/Users/zouyingjie/soft/study/ELK/logstash-6.2.2/vendor/bundle/jruby/2.3.0/gems/logstash-filter-geoip-5.0.3-java/vendor/GeoLite2-City.mmdb"}
[2018-03-08T23:12:53,026][INFO ][logstash.inputs.beats    ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}
[2018-03-08T23:12:53,195][INFO ][logstash.pipeline        ] Pipeline started succesfully {:pipeline_id=>"main", :thread=>"#<Thread:0x66461e40 run>"}
[2018-03-08T23:12:53,290][INFO ][org.logstash.beats.Server] Starting server on port: 5044
[2018-03-08T23:12:53,401][INFO ][logstash.agent           ] Pipelines running {:count=>1, :pipelines=>["main"]}

2. 安裝執行 FileBeats

tar zxvf filebeat-6.2.2-darwin-x86_64.tar.gz
cd filebeat-6.2.2-darwin-x86_64

進入目錄編輯 filebeat.yml 找到對應的配置項,配置如下

- type: log
   # Change to true to enable this prospector configuration.
    enabled: True

    # Paths that should be crawled and fetched. Glob based paths.
    # 讀取 Nginx 的日誌
    paths:
      - /usr/local/nginx/logs/*.log

#----------------------------- Logstash output --------------------------------
# 輸出到本機的 LogStash
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

配置完成後執行如下命令,啟動 FileBeat 即可

# FileBeat 需要以 root 身份啟動,因此先更改配置檔案的許可權
sudo chown root filebeat.yml
sudo ./filebeat -e -c filebeat.yml -d "publish"

三. Kibana 的安裝執行

tar zxvf kibana-6.2.2-darwin-x86_64.tar.gz
cd kibana-6.2.2-darwin-x86_64
# 直接啟動即可
bin/kibana

Kibana 預設連結了本機的 9200 埠,其繫結的埠為 5601,啟動成功後直接訪問 127.0.0.1:5601 埠即可,介面如下。我因為安裝了 x-pack 外掛因此顯示的項可能會多一些,這個暫時忽略.

這裡寫圖片描述

點選右上方的 Discover. 介面會提示建立索引模式,通過這個來檢索 ES 中的索引,可以看到已經有一個 Logstash 的索引了,輸入名稱進行完全匹配,

這裡寫圖片描述

這裡選定一個時間戳,使用預設的 timestamp 即可,設定完成後我們可以根據時間範圍篩選資料。

這裡寫圖片描述

設定完成後建立後顯示如下

這裡寫圖片描述

這時在點選 Discover 就可以看到我們建立的索引了,此時輸入 UnicodeEncodeError 已經返回了匹配到的日誌資訊。
這裡寫圖片描述

至此就完成了簡單的日誌分析平臺的搭建。OK,關於安裝就介紹到這裡,後面正式開始對整個 ELK Stack 的學習。