雖然用了ELK很久了,但一直苦於沒有自己嘗試搭建過,所以想抽時間嘗試嘗試。原本打算按照教程 《ELK集中式日志平台之二 — 部署》(作者:樊浩柏科學院) 進行測試的,沒想到一路出了很多坑,所以又按照自己成功搭建的流程寫了本文。
《ELK集中式日志平台之二 — 部署》一文參考價值非常大,圖文並茂,大家可以在學習過程中參考參考。作者一上來就安裝ELK插件,實際可以按需選擇安裝,但作為初學者,無疑增加了復雜度。ELK插件后續我會單獨拿出來講解,本文略過。
簡介
ELK 指的是一套解決方案,是 Elasticsearch、Logstash 和 Kibana 三種軟件產品的首字母縮寫,Beats 是 ELK 協議棧的新成員。
- E:代表 Elasticsearch,負責日志的存儲和檢索;
- L:代表 Logstash,負責日志的收集、過濾和格式化;
- K:代表 Kibana,負責日志數據的可視化;
- Beats:是一類輕量級數據采集器;

本來ELK是沒有Beats的。
最開始的架構中,由 Logstash 承擔數據采集器和過濾功能,並部署在應用服務器。由於 Logstash 對大量日志進行過濾操作,會消耗應用系統的部分性能,帶來不合理的資源分配問題;另一方面,過濾日志的配置,分布在每台應用服務器,不便於集中式配置管理。
所以就有了Beats。
由於 Beats 的系統性能開銷更小,所以應用服務器性能開銷可以忽略不計;另一方面,Beats 可以作為數據采集插件形式工作,可以按需啟用 Beats 下不同功能的插件,更靈活,擴展性更強。例如,應用服務器只啟用 Filebeat,則只收集日志文件數據,如果某天需要收集系統性能數據時,再啟用 Metricbeat 即可,並不需要太多的修改和配置。

其中,目前 Beats 家族根據功能划分,主要有:
-
Filebeat
Real-time insight into log data.
負責收集文件數據。 -
Packetbeat
Analyze network packet data.
負責收集網絡流量數據。 -
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版本
ELK各自版本最好都是一致的,否則可能會有兼容性問題。
本次都是使用5.6.2版本。截止到2018-09-23,官網的最新版本是6.4.1。
官網下載地址:
https://www.elastic.co/downloads
- elasticsearch
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.tar.gz - kibana
https://artifacts.elastic.co/downloads/kibana/kibana-5.6.2-linux-x86_64.tar.gz - logstash
https://artifacts.elastic.co/downloads/logstash/logstash-5.6.2.tar.gz - filebeat
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.2-linux-x86_64.tar.gz
歷史版本匯集頁:
https://www.elastic.co/downloads/past-releases
安裝方式
安裝有兩種方法:
- yum安裝
- 二進制包手動安裝
建議第二種方法,可以自由安裝版本及定義安裝目錄。
啟動方式
另外需要注意的是:ELK系列軟件啟動服務的時候不允許以root用戶啟動。這里我們統一建立用戶 elk:
useradd elk
Mac因為默認用戶就不是root,可以忽略這一步。
啟動軟件的時候,有2種方式啟動:
- 切換到elk用戶執行命名
- 配置service,使用
service啟動
測試的時候建議以第一種,這樣可以及時查看錯誤日志。生產環境可以配置service啟動。
特點
1、ElasticSearch、Kibana都支持安裝插件:例如x-pack。
2、ElasticSearch、Kibana的配置文件一般在安裝目錄的config里(yml格式),二進制文件在bin里。ElasticSearch和Logstatsh config目錄都有jvm.options,測試環境建議修改:
-Xms256m
-Xmx1g
默認可能是2g,測試環境改小一點。后面這點還會說明。
配置JDK
安裝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)
安裝 ElasticSearch
二進制安裝
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負責日志數據的可視化。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。
啟動kibana
/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/..
配置web
默認打開瀏覽器 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 導入日志數據。
安裝 Logstash
二進制方式安裝
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
1、修改 config/jvm.options:
vim /usr/local/elk/logstash/config/jvm.options
這里我修改為:
-Xms128m
-Xmx512m
2、修改 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
測試logstash
由於現在我們還沒有安裝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
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
filebeat采集內容發送到ElasticSearch
為了讓測試簡單,我們手動模擬日志的生成:
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 日志類型,默認log
- input_type 輸入類型,默認log
- paths 采集的日志,可以使用通配符。支持多個
- tags 自定義標簽,是個數組。自定義
- document_type 自定義字段,用於Logsatsh區分來源,在Logsatsh里用變量
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還默認加了一些字段:
- @timestamp 時間
- beat filebeat相關信息,數組類型
- input_type 日志類型,一般是log
- message 日志原文
- offset 當前采集的日志的偏移量
- source 日志所在文件
- tags 自定義標簽,數組類型
- type document_type字段定義的內容
kibana里查看
打開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
接下來,我們將日志使用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個軟件:
- elasticsearch-5.6.2
- kibana-5.6.2-linux-x86_64
- logstash-5.6.2
- filebeat-5.6.2-linux-x86_64
其中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 -
- 9200 elasticsearch默認端口
- 5601 kibana 默認端口
- 5046 logstash 收集日志
參考
1、ELK集中式日志平台之二 — 部署 - 樊浩柏's Blog
https://www.fanhaobai.com/2017/12/elk-install.html
2、ElasticSearch 5學習(1)——安裝Elasticsearch、Kibana和X-Pack - wuxiwei - 博客園
https://www.cnblogs.com/wxw16/p/6150681.html
3、Logstash Filebeat 安裝配置之使用 Kibana 分析日志數據 - 任我樂
https://renwole.com/archives/661
4、ELK集中式日志平台之一 — 平台架構 - 樊浩柏's Blog
https://www.fanhaobai.com/2017/12/elk.html
5、ELK集中式日志平台之三 — 進階 - 樊浩柏's Blog
https://www.fanhaobai.com/2017/12/elk-advanced.html
6、ELK+Filebeat 集中式日志解決方案詳解
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
