雖然用了ELK好久了,但一直苦於沒有本身嘗試搭建過,因此想抽時間嘗試嘗試。本來打算按照教程 《ELK集中式日誌平臺之二 — 部署》(做者:樊浩柏科學院) 進行測試的,沒想到一路出了不少坑,因此又按照本身成功搭建的流程寫了本文。php
《ELK集中式日誌平臺之二 — 部署》一文參考價值很是大,圖文並茂,你們能夠在學習過程當中參考參考。做者一上來就安裝ELK插件,實際能夠按需選擇安裝,但做爲初學者,無疑增長了複雜度。ELK插件後續我會單獨拿出來說解,本文略過。html
ELK 指的是一套解決方案,是 Elasticsearch、Logstash 和 Kibana 三種軟件產品的首字母縮寫,Beats 是 ELK 協議棧的新成員。java
原本ELK是沒有Beats的。linux
最開始的架構中,由 Logstash 承擔數據採集器和過濾功能,並部署在應用服務器。因爲 Logstash 對大量日誌進行過濾操做,會消耗應用系統的部分性能,帶來不合理的資源分配問題;另外一方面,過濾日誌的配置,分佈在每臺應用服務器,不便於集中式配置管理。nginx
因此就有了Beats。web
因爲 Beats 的系統性能開銷更小,因此應用服務器性能開銷能夠忽略不計;另外一方面,Beats 能夠做爲數據採集插件形式工做,能夠按需啓用 Beats 下不一樣功能的插件,更靈活,擴展性更強。例如,應用服務器只啓用 Filebeat,則只收集日誌文件數據,若是某天須要收集系統性能數據時,再啓用 Metricbeat 便可,並不須要太多的修改和配置。shell
其中,目前 Beats 家族根據功能劃分,主要有:apache
Filebeat Real-time insight into log data. 負責收集文件數據。json
Packetbeat Analyze network packet data. 負責收集網絡流量數據。vim
Winlogbeat Analyze Windows event logs. 負責收集 Windows 事件日誌數據。
Metricbeat Ship and analyze metrics. 負責收集系統級的 CPU 使用率、內存、文件系統、磁盤 IO 和網絡 IO 統計數據。
Heartbeat Ping your Infrastructure.
Auditbeat Send audit data to Elasticsearch.
若是日誌量巨大,可能還會引入Kafka用以均衡網絡傳輸,從而下降了網絡閉塞,尤爲是丟失數據的可能性;另外一方面,這樣能夠系統解耦,具備更好的靈活性和擴展性。
環境:CentOS6.8
ELK各自版本最好都是一致的,不然可能會有兼容性問題。 本次都是使用5.6.2版本。截止到2018-09-23,官網的最新版本是6.4.1。
官網下載地址: https://www.elastic.co/downloads
歷史版本聚集頁: https://www.elastic.co/downloads/past-releases
安裝有兩種方法:
建議第二種方法,能夠自由安裝版本及定義安裝目錄。
另外須要注意的是:ELK系列軟件啓動服務的時候不容許以root用戶啓動。這裏咱們統一創建用戶 elk
:
useradd elk
Mac由於默認用戶就不是root,能夠忽略這一步。
啓動軟件的時候,有2種方式啓動:
service
啓動測試的時候建議以第一種,這樣能夠及時查看錯誤日誌。生產環境能夠配置service
啓動。
一、ElasticSearch、Kibana都支持安裝插件:例如x-pack。 二、ElasticSearch、Kibana的配置文件通常在安裝目錄的config裏(yml格式),二進制文件在bin裏。ElasticSearch和Logstatsh config目錄都有jvm.options
,測試環境建議修改:
-Xms256m -Xmx1g
默承認能是2g,測試環境改小一點。後面這點還會說明。
安裝JDK1.8:
yum install -y java-1.8.0-openjdk
配置環境變量:
vi /etc/profile
增長:
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.x86_64 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar JAVACMD=/usr/bin/java export JAVA_HOME JAVACMD CLASSPATH PATH
而後使之生效:
source /etc/profile
驗證版本信息:
# java -version openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.tar.gz
大小32.2M。安裝很簡單,解壓便可:
mkdir -p /usr/local/elk tar zxvf elasticsearch-5.6.2.tar.gz -C /usr/local/elk mv /usr/local/elk/elasticsearch-5.6.2 /usr/local/elk/elasticsearch
配置權限:
chown -R elk:elk /usr/local/elk/elasticsearch
對目錄/usr/local/elk/elasticsearch
的增刪改操做建議使用上面建立的elk用戶,不然還要使用chown命令修改權限。
su -e elk
修改config/jvm.options
:
vi /usr/local/elk/elasticsearch/config/jvm.options
根據實際狀況修改:默認是2g:
# 最小值 -Xms256m #最大值 -Xmx1g
我測試的時候忘記修改了,測試機器卡死了。
若是沒有配置service
啓動方式,須要切換用戶。
su - elk # -d表示後臺運行 /usr/local/elk/elasticsearch/bin/elasticsearch -d
查看是否已運行:
$ netstat -tulnp | grep 9200 tcp 0 0 127.0.0.1:9200 0.0.0.0:* LISTEN 121/java
默認是 9200 端口。若是須要修改,能夠編輯config/elasticsearch.yml
。
$ curl http://127.0.0.1:9200 { "name" : "6e1PMnr", "cluster_name" : "elasticsearch", "cluster_uuid" : "Uahv9iLnSLyMjIxX57lbMQ", "version" : { "number" : "5.6.2", "build_hash" : "bd92e7f", "build_date" : "2017-12-17T20:23:25.338Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
防盜版聲明:本文系原創文章,發佈於公衆號飛鴻影的博客
(fhyblog)及博客園,轉載需做者贊成。
Kibana負責日誌數據的可視化。Kibana從ElasticSearch裏讀取數據。
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.2-linux-x86_64.tar.gz
大小48.5M。一樣是解壓:
tar zxvf kibana-5.6.2-linux-x86_64.tar.gz -C /usr/local/elk/ mv /usr/local/elk/kibana-5.6.2-linux-x86_64 /usr/local/elk/kibana chown -R elk:elk /usr/local/elk/kibana
對目錄/usr/local/elk/kibana
的增刪改操做建議使用上面建立的elk用戶,不然還要使用chown命令修改權限。
su -e elk
修改配置:
vim /usr/local/elk/kibana/config/kibana.yml
默認配置都是註釋了的,默認端口是5601,默認訪問 elasticsearch 的9200端口。咱們能夠按需修改。例如:
server.port: 5601 # 監聽端口 server.host: "0.0.0.0" # 綁定地址 #server.name: "elk.fanhaobai.com" # 域名 #elasticsearch.url: "http://127.0.0.1:9200" # es #kibana.index: ".kibana" # 索引名 #elasticsearch.username: "elastic" # 用戶名 #elasticsearch.password: "changeme" # 密碼
這裏修改了server.host
,默認是localhost
。
/usr/local/elk/kibana/bin/kibana
注意:默認是前臺運行的,若是須要後臺運行:
nohup /usr/local/elk/kibana/bin/kibana &
可使用前臺運行的方式,沒有報錯誤,而後使用後臺運行的方式。
查看是否已運行:
$ netstat -tulnp | grep 5601 tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 248/./kibana/bin/..
默認打開瀏覽器 http://127.0.0.1:5601 就能夠看到 kibana 的界面了:
也能夠配置Nginx代理到別的域名:
server { listen 80; server_name elk.cc; #當前主機名 # auth_basic "Restricted Access"; # auth_basic_user_file /usr/local/nginx/conf/htpasswd.users; #登陸驗證 location / { proxy_pass http://127.0.0.1:5601; #轉發到kibana proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
到如今尚未數據能夠展現,由於ES裏咱們尚未導入或者傳入數據。接下來咱們使用 Logstash+Filebeat 導入日誌數據。
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.2.tar.gz tar zxvf logstash-5.6.2-linux.gz -C /usr/local/elk/ mv /usr/local/elk/logstash-5.6.2/ /usr/local/elk/logstash chown -R elk:elk /usr/local/elk/logstash
logstash-5.6.2.tar.gz 大小96.8M。
對目錄/usr/local/elk/logstash
的增刪改操做建議使用上面建立的elk用戶,不然還要使用chown命令修改權限。
# 切換用戶 su - elk
一、修改 config/jvm.options
:
vim /usr/local/elk/logstash/config/jvm.options
這裏我修改成:
-Xms128m -Xmx512m
二、修改 config/logstash.yml
:
vim /usr/local/elk/logstash/config/logstash.yml
默認全是註釋的,這裏僅修改一處:
path.config: /usr/local/elk/logstash/config/conf.d
這樣就支持子配置了,咱們能夠把新建的配置都放在conf.d
目錄裏。
注意:
path.config:
後面有一個空格。
而後建立子文件夾:
mkdir /usr/local/elk/logstash/config/conf.d
因爲如今咱們尚未安裝filebeat,也不打算直接使用logstash收集日誌,因此先簡單測試下標準輸入輸出,只要正常就好了:
$ ./logstash/bin/logstash -e 'input { stdin { } } output { stdout {}}'
稍等幾秒鐘:
Sending Logstash's logs to /usr/local/elk/logstash/logs which is now configured via log4j2.properties [2018-09-24T23:07:35,424][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/usr/local/elk/logstash/modules/netflow/configuration"} [2018-09-24T23:07:35,434][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/usr/local/elk/logstash/modules/fb_apache/configuration"} [2018-09-24T23:07:35,657][INFO ][logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500} [2018-09-24T23:07:35,683][INFO ][logstash.pipeline ] Pipeline main started The stdin plugin is now waiting for input: [2018-09-24T23:07:35,776][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} hello 2018-09-24T15:07:42.760Z 2106567e5bce hello welcome 2018-09-24T15:07:49.501Z 2106567e5bce welcome
咱們輸入了hello、welcome,終端實時的輸出了內容。後面的內容裏,咱們將會修改 stdin 爲爲beats,修改 stdout 爲ElasticSearch。
若是新增配置,須要後臺常駐運行,可使用下列命令:
/usr/local/elk/logstash/bin/logstash &
查看是否已運行(須要過10s左右,能夠多刷幾回):
$ netstat -tulnp | grep 5044 tcp 0 0 0.0.0.0:5044 0.0.0.0:* LISTEN 1040/java
Filebeat不依賴JDK。
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.2-linux-x86_64.tar.gz
filebeat 8.4M。解壓、設置 :
mkdir /usr/local/elk/beats tar zxvf filebeat-5.6.2-linux-x86_64.tar.gz -C /usr/local/elk/beats/ mv /usr/local/elk/beats/filebeat-5.6.2-linux-x86_64/ /usr/local/elk/beats/filebeat chown -R elk:elk /usr/local/elk/beats
注意:後續對目錄/usr/local/elk/beats
的增刪改操做建議使用上面建立的elk用戶,不然還要使用chown命令修改權限。
# 切換用戶 su - elk
爲了讓測試簡單,咱們手動模擬日誌的生成:
echo "test - test2" >> /tmp/test1.log echo "test - test2" >> /tmp/test2.log
生成了2個日誌文件test1.log
、test2.log
,各有一行日誌。
新建一個filebeat配置文件:
cd /usr/local/elk vim beats/filebeat/filebeat.test.yml
配置內容:
filebeat.prospectors: - type: log paths: - /tmp/test1.log tags: ["test1"] document_type: test1 - type: log paths: - /tmp/test2.log tags: ["test2"] document_type: test2 output.elasticsearch: hosts: ["127.0.0.1:9200"] index: "test-filebeat"
配置說明:
filebeat.prospectors:
type
表示一個-
表示一個filebeat.prospector
,這裏設置了2個。日誌發送到elasticsearch,索引index 是test-filebeat
。
咱們運行 filebeat:
# 修改權限 chmod 600 beats/filebeat/filebeat.test.yml # 指定配置文件前臺運行 ./beats/filebeat/filebeat -c beats/filebeat/filebeat.test.yml
咱們新開終端查看ES裏是否新增了內容:
curl http://127.0.0.1:9200/test-filebeat/_search?q=* { "took": 0, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1, "hits": [ { "_index": "test-filebeat", "_type": "test2", "_id": "AWYL9s4WJzfnbYlB_DSO", "_score": 1, "_source": { "@timestamp": "2018-09-24T14:23:30.652Z", "beat": { "hostname": "2106567e5bce", "name": "2106567e5bce", "version": "5.6.2" }, "input_type": "log", "message": "test - test2", "offset": 13, "source": "/tmp/test2.log", "tags": [ "test2" ], "type": "test2" } }, { "_index": "test-filebeat", "_type": "test1", "_id": "AWYL9s4WJzfnbYlB_DSP", "_score": 1, "_source": { "@timestamp": "2018-09-24T14:23:30.652Z", "beat": { "hostname": "2106567e5bce", "name": "2106567e5bce", "version": "5.6.2" }, "input_type": "log", "message": "test - test2", "offset": 13, "source": "/tmp/test1.log", "tags": [ "test1" ], "type": "test1" } } ] } }
新開命令行追加一行日誌:
echo "new msg" >> /tmp/test1.log
curl http://127.0.0.1:9200/test-filebeat/_search?q=*&size=1&sort=@timestamp:desc { "took": 0, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": null, "hits": [ { "_index": "test-filebeat", "_type": "test1", "_id": "AWYL-BjvJzfnbYlB_DSQ", "_score": null, "_source": { "@timestamp": "2018-09-24T14:24:55.654Z", "beat": { "hostname": "2106567e5bce", "name": "2106567e5bce", "version": "5.6.2" }, "input_type": "log", "message": "new msg", "offset": 21, "source": "/tmp/test1.log", "tags": [ "test1" ], "type": "test1" }, "sort": [ 1537799095654 ] } ] } }
這說明直接使用filebeat,也是能夠發送數據到ES的,爲何還用logstash呢?緣由是filebeat採集的是原始日誌內容,發送到ES的也是原始內容,若是不須要處理的話,使用filebeat也行。
咱們能夠看到返回的文檔json裏有一個字段 message
,這個是日誌原始內容。filebeat還默認加了一些字段:
打開kibana web地址:http://127.0.0.1:5601,依次打開:Management
-> Kibana
-> Index Patterns
,選擇Create Index Pattern
: a. Index pattern 輸入:test-filebeat
; b. Time Filter field name 選擇 @timestamp
。 c. 點擊Create。
而後打開Discover,選擇 test-filebeat 就能看到日誌數據了。
這時候咱們去訪問下本身配置了nginx日誌的應用,這裏能實時更新,不再用去命令行使用tail查看了。
接下來,咱們將日誌使用filebeat發送到logstash,而後經過logstash處理後發送到ElasticSearch。
首先咱們要修改上一節裏filebeat的配置:
vim beats/filebeat/filebeat.test.yml
改成:
filebeat.prospectors: - type: log paths: - /tmp/test1.log tags: ["test1"] document_type: test1 - type: log paths: - /tmp/test2.log tags: ["test2"] document_type: test2 output.logstash: hosts: ["127.0.0.1:5046"] #output.elasticsearch: # hosts: ["127.0.0.1:9200"] # index: "test-filebeat"
咱們把output.elasticsearch
註釋了,新增了output.logstash
。
而後新增logstash配置:
vim logstash/config/conf.d/filebeat.test.conf
input { beats { port => 5046 } } output { elasticsearch { hosts => ["127.0.0.1:9200"] index => "test-filebeat-%{type}" } stdout { codec => rubydebug } }
這裏的type
變量就是filebeat裏面的document_type
。端口指定爲5046(自定義便可),和filebeat裏面配置的一致。logstash能夠有多個子配置,因此也就能配置多個端口。此時,logstash是做爲服務端運行的,filebeat是客戶端。
接下來咱們啓動logstash和filebeat:
./logstash/bin/logstash &
&
表示後臺運行:
./beats/filebeat/filebeat -c beats/filebeat/filebeat.test.yml
咱們新開終端往日誌里加點新內容:
echo "new msg" >> /tmp/test2.log echo "new msg3" >> /tmp/test2.log
稍等幾秒鐘,咱們能夠查看ES裏的數據:
curl http://127.0.0.1:9200/test-filebeat-test2/_search?q=*&sort=@timestamp:desc { "took": 3, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": null, "hits": [ { "_index": "test-filebeat-test2", "_type": "test2", "_id": "AWYMF-PeJzfnbYlB_DSo", "_score": null, "_source": { "@timestamp": "2018-09-24T14:59:38.188Z", "offset": 49, "@version": "1", "input_type": "log", "beat": { "name": "2106567e5bce", "hostname": "2106567e5bce", "version": "5.6.2" }, "host": "2106567e5bce", "source": "/tmp/test2.log", "message": "new msg3", "type": "test2", "tags": [ "test2", "beats_input_codec_plain_applied", "_grokparsefailure" ] }, "sort": [ 1537801178188 ] }, { "_index": "test-filebeat-test2", "_type": "test2", "_id": "AWYMF-PeJzfnbYlB_DSn", "_score": null, "_source": { "@timestamp": "2018-09-24T14:59:38.186Z", "offset": 40, "@version": "1", "input_type": "log", "beat": { "name": "2106567e5bce", "hostname": "2106567e5bce", "version": "5.6.2" }, "host": "2106567e5bce", "source": "/tmp/test2.log", "message": "new msg", "type": "test2", "tags": [ "test2", "beats_input_codec_plain_applied", "_grokparsefailure" ] }, "sort": [ 1537801178186 ] } ] } }
本節裏咱們雖然用到了logstash,但沒有發揮它的強大處理功能。僅僅是演示了將日誌使用filebeat發送到logstash,而後經過logstash處理後發送到ElasticSearch。處理功能後續再作講解。
提示:其實咱們能夠在logstash里根據filebeat裏的document_type作條件判斷:
# 根據tags判斷 if "test1" in [tags] { # something } # type 就是filebeat裏的document_type if [type] == 'test1'{ }else if [type] == 'test2'{ }
ELK咱們一共安裝了4個軟件:
其中es、kibana、logstash三者做爲服務端安裝在一塊兒,filebeat安裝在應用服務器,用於收集日誌。
咱們看一下共起了哪些端口:
$ netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 13/php-fpm tcp 0 0 127.0.0.1:9200 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10/nginx tcp 0 0 0.0.0.0:5046 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:9300 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:9600 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN -
一、ELK集中式日誌平臺之二 — 部署 - 樊浩柏's Blog https://www.fanhaobai.com/2017/12/elk-install.html
二、ElasticSearch 5學習(1)——安裝Elasticsearch、Kibana和X-Pack - wuxiwei - 博客園 http://www.javashuo.com/article/p-nejdtyyk-bs.html
三、Logstash Filebeat 安裝配置之使用 Kibana 分析日誌數據 - 任我樂 https://renwole.com/archives/661
四、ELK集中式日誌平臺之一 — 平臺架構 - 樊浩柏's Blog https://www.fanhaobai.com/2017/12/elk.html
五、ELK集中式日誌平臺之三 — 進階 - 樊浩柏's Blog https://www.fanhaobai.com/2017/12/elk-advanced.html
六、ELK+Filebeat 集中式日誌解決方案詳解 https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
原文出處:https://www.cnblogs.com/52fhy/p/10053076.html