ELK技術實戰–瞭解Elk各組件 轉載 http://www.ywnds.com/?p=9776php
ELK Stack是軟件集合Elasticsearch、Logstash、Kibana的簡稱,由這三個軟件及其相關的組件能夠打造大規模日誌實時處理系統。java
其中,Elasticsearch 是一個基於 Lucene 的、支持全文索引的分佈式存儲和索引引擎,主要負責將日誌索引並存儲起來,方便業務方檢索查詢。node
Logstash是一個日誌收集、過濾、轉發的中間件,主要負責將各條業務線的各種日誌統一收集、過濾後,轉發給 Elasticsearch 進行下一步處理。linux
Kibana是一個可視化工具,主要負責查詢 Elasticsearch 的數據並以可視化的方式展示給業務方,好比各種餅圖、直方圖、區域圖等。nginx
所謂「大規模」,指的是 ELK Stack 組成的系統以一種水平擴展的方式支持天天收集、過濾、索引和存儲 TB 規模以上的各種日誌。git
一般,各種文本形式的日誌都在處理範圍,包括但不限於 Web 訪問日誌,如 Nginx/Apache Access Log 。github
基於對日誌的實時分析,能夠隨時掌握服務的運行情況、統計 PV/UV、發現異常流量、分析用戶行爲、查看熱門站內搜索關鍵詞等。web
版本跳躍redis
ELK在5.0版本之後(從2.x版本直接所有升級爲5.x版本),Elastic公司將原來的ELK Stack稱之爲Elastic Stack,緣由是引入了Beats套件。
Elastic Products全家福:
對於ELK部署使用而言,下面是一個再常見不過的架構了,以下圖:
上圖是ELK Stack實際應用中典型的一種架構,其中:
1)filebeat:部署在具體的業務機器上,經過定時監控的方式獲取增量的日誌,並轉發到Kafka消息系統暫存。
2)Kafka:以高吞吐量的特徵,做爲一個消息系統的角色,接收從filebeat收集轉發過來的日誌,一般以集羣的形式提供服務。
3)logstash:而後,Logstash從Kafka中獲取日誌,並經過Input-Filter-Output三個階段的處理,更改或過濾日誌,最終輸出咱們感興趣的數據。一般,根據Kafka集羣上分區(Partition)的數量,1:1肯定Logstash實例的數量,組成Consumer Group進行日誌消費。
4)elasticsearch:最後,Elasticsearch存儲並索引Logstash轉發過來的數據,並經過Kibana查詢和可視化展現,達到實時分析日誌的目的。
Elasticsearch/Kibana還能夠經過安裝x-pack插件實現擴展功能,好比監控Elasticsearch集羣狀態、數據訪問受權等。
咱們一步步安裝部署Elastic Stack系統的各個組件,而後以網站訪問日誌爲例進行數據實時分析。
首先,到ELK 官網下載須要用到的Filebeat/Logstash/Elasticsearch/Kibana軟件安裝包。(推薦下載編譯好的二進制可執行文件,直接解壓執行就能夠部署)
1. 系統環境
1
2
3
4
5
6
7
|
System: Centos release 7.2 (Final)
ElasticSearch: 5.4.1
Logstash: 5.4.1
Kibana: 5.4.1
Java: openjdk version "1.8.0_131"
kafka: 2.10
Nginx: 1.10.1
|
2. 軟件下載
1
2
3
4
5
|
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.1.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.1-linux-x86_64.tar.gz
wget http://apache.fayea.com/kafka/0.10.2.1/kafka_2.10-0.10.2.1.tgz
|
這裏我下載是我所使用的軟件版本(都是當前最新版),若是你想使用舊一點或者更新一點的版本能夠自行下載。
1
2
3
4
5
6
7
8
9
|
$ ll
total 327156
-rw-r--r-- 1 root root 1539364 Jun 5 05:33 3.2.0.tar.gz
-rw-r--r-- 1 root root 33321278 Jun 1 09:58 elasticsearch-5.4.1.tar.gz
-rw-r--r-- 1 root root 8780385 Jun 1 09:57 filebeat-5.4.1-linux-x86_64.tar.gz
-rw-r--r-- 1 root root 53791517 Jun 1 09:59 kibana-5.4.1-linux-x86_64.tar.gz
-rw-r--r-- 1 root root 92710340 Jun 1 09:59 logstash-5.4.1.tar.gz
-rw-r--r-- 1 root root 9788179 Jun 1 09:58 packetbeat-5.4.1-linux-x86_64.tar.gz
-rw-r--r-- 1 root root 38424081 Apr 26 15:59 kafka_2.10-0.10.2.1.tgz
|
3. 安裝Nginx
這裏咱們部署ELK以前,須要一個產生日誌的源,這裏呢就選項Nginx服務器。
默認狀況下,CentOS的官方資源是沒有php-fpm和Nginx的,須要安裝第三方資源庫便可。(此步驟可省略)
1
2
3
|
$ wget http://www.atomicorp.com/installers/atomic
$ sh ./atomic
$ yum check-update
|
安裝啓動nginx(關於nginx能夠看本博客也有詳細介紹)
1
2
|
$ yum install nginx -y
$ nginx
|
1
2
|
$ netstat -nplt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12719/nginx: master
|
nginx的訪問日誌格式定義,默認以下:
1
2
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
|
在/etc/nginx/conf.d/default.conf中添加以下一行,定義nginx日誌使用的格式,以及日誌文件的位置。
1
|
access_log /var/log/nginx/access.log main;
|
而後從新啓動nginx
1
2
|
$ nginx -s stop
$ nginx
|
4. 安裝JAVA
因爲kafka/logstash/elastisearch的運行依賴於Java環境, 而Logstash 1.5以上版本依賴java版本不能低於java 1.7,所以推薦使用最新版本的Java。由於咱們只須要Java的運行環境,因此能夠只安裝JRE,不過這裏我依然使用JDK。因爲我使用的是CentOS7系統,java版本是1.8,符合需求,我就使用yum直接安裝了。
1
|
$ yum install java-1.8.0-openjdk
|
查看JAVA版本
1
2
3
4
|
$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
|
若是java -version沒有問題,就不須要設置環境變量。通常使用yum安裝的jdk不須要設置JAVA_HOME環境變量。若是你是使用二進制版本安裝的jdk,那麼可能須要設置一下JAVA_HOME環境變量,具體的JAVA_HOME環境變量設置根據安裝路徑不一樣而不一樣。
5. 安裝部署Kafka
確認已安裝java運行環境,直接解壓Kafka便可使用。
1
|
$ tar xvf kafka_2.10-0.10.2.1.tgz -C /usr/local/elk
|
解壓後,編輯配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
$ cat /usr/local/elk/kafka_2.10-0.10.2.1/config/server.properties
############################# Server Basics #############################
broker.id=0
delete.topic.enable=true
############################# Socket Server Settings #############################
listeners=PLAINTEXT://0.0.0.0:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
############################# Log Basics #############################
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
############################# Log Flush Policy #############################
log.flush.interval.messages=10000
log.flush.interval.ms=1000
############################# Log Retention Policy #############################
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
############################# Zookeeper #############################
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
|
kafka須要依賴zookeeper,因此須要先啓動zookeeper。
1
|
$ nohup /usr/local/elk/kafka_2.10-0.10.2.1/bin/zookeeper-server-start.sh /usr/local/elk/kafka_2.10-0.10.2.1/config/zookeeper.properties &
|
啓動Kafka Server:(指定 JMX_PORT 端口,能夠經過 Kafka-manager 獲取統計信息)
1
|
$ nohup /usr/local/elk/kafka_2.10-0.10.2.1/bin/kafka-server-start.sh /usr/local/elk/kafka_2.10-0.10.2.1/config/server.properties &
|
6. 安裝部署Filebeat
1
|
$ tar xvf filebeat-5.4.1-linux-x86_64.tar.gz -C /usr/local/elk/
|
把filebeat解壓後就可使用了,是否是很簡單。
開啓日誌增量監控 ,添加filebeat輸出源爲kafka(修改filebeat.yml文件):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
$ cat /usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat.yml
filebeat.prospectors:
- input_type: log
paths:
- /var/log/*.log
- input_type: log
paths:
- /var/log/nginx/*.log
encoding: utf-8
document_type: my-nginx-log
scan_frequency: 10s
harvester_buffer_size: 16384
max_bytes: 10485760
tail_files: true
output.kafka:
enabled: true
hosts: ["127.0.0.1:9092"]
topic: elk-%{[type]}
worker: 2
max_retries: 3
bulk_max_size: 2048
timeout: 30s
broker_timeout: 10s
channel_buffer_size: 256
keep_alive: 60
compression: gzip
max_message_bytes: 1000000
required_acks: 0
client_id: beats
|
上述配置表示,Filebeat按期監控:/var/log/nginx/目錄下全部以.log結尾的文件,而且將增量日誌轉發到Kafka集羣。filebeat支持file、tcp、udp等輸入方式,輸出方式支持kafka,file,redis,elasticsearch、logstash等。
而後,後臺啓動Filebeat進程:
1
|
$ nohup /usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat -c /usr/local/elk/filebeat-5.4.1-linux-x86_64/filebeat.yml &
|
這時候,在瀏覽器上訪問Nginx服務器並生成訪問日誌後,Filebeat 會及時的將日誌轉發到 Kafka 集羣。
咱們這個時候能夠查一下kafka的隊列信息,能夠看到有elk-log的。
1
2
3
|
$ /usr/local/elk/kafka_2.10-0.10.2.1/bin/kafka-topics.sh --list --zookeeper localhost:2181
__consumer_offsets
elk-log
|
具體深刻kafka須要單獨學習了,若是嫌麻煩可使用Redis比較簡單。
7. 安裝配置Logstash
1
|
$ tar xvf logstash-5.4.1.tar.gz -C /usr/local/elk
|
7.1 開始使用logstash
在終端中,像下面這樣運行命令來啓動 Logstash進程:
1
2
3
4
5
6
7
8
9
10
|
$ /usr/local/elk/logstash-5.4.1/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
Sending Logstash's logs to /usr/local/elk/logstash-5.4.1/logs which is now configured via log4j2.properties
[logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/local/elk/logstash-5.4.1/data/queue"}
[logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"cbfff69e-1504-48f8-bd8b-6b37b8e6b1d9", :path=>"/usr/local/elk/logstash-5.4.1/data/uuid"}
[logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
[logstash.pipeline ] Pipeline main started
The stdin plugin is now waiting for input:
[2017-06-05T09:41:06,159][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello world
|
執行完命令,而後你會發現終端在等待你的輸入。沒問題,敲入hello world,而後回車,logstash會返回如下結果!
1
2
3
4
5
6
|
{
"@timestamp" => 2017-06-05T13:41:41.840Z,
"@version" => "1",
"host" => "gpmaster",
"message" => "hello world"
}
|
輸出沒有問題,就證實能夠正式來使用logstash了。
解釋一下命令含義
每位系統管理員都確定寫過不少相似這樣的命令:cat randdata | awk ‘{print $2}’ | sort | uniq -c | tee sortdata。這個管道符|能夠算是Linux世界最偉大的發明之一(另外一個是「一切皆文件」)。Logstash就像管道符同樣!你輸入(就像命令行的 cat )數據,而後處理過濾(就像 awk 或者 uniq 之類)數據,最後輸出(就像 tee )到其餘地方。
Logstash會給事件添加一些額外信息。最重要的就是@timestamp,用來標記事件的發生時間。由於這個字段涉及到Logstash的內部流轉,因此必須是一個job對象,若是你嘗試本身給一個字符串字段重命名爲@timestamp的話,Logstash會直接報錯。因此,請使用filters/date插件來管理這個特殊字段。
此外,大多數時候,還能夠見到另外幾個:
host – 標記事件發生在哪裏。
type – 標記事件的惟一類型。
tags – 標記事件的某方面屬性,這是一個數組,一個事件能夠有多個標籤。
你能夠隨意給事件添加字段或者從事件裏刪除字段。事實上事件就是一個 Ruby對象,或者更簡單的理解爲就是一個哈希也行。
小貼士:每一個logstash過濾插件,都會有四個方法叫add_tag, remove_tag, add_field和remove_field。它們在插件過濾匹配成功時生效。
Logstash的運行方式爲主程序+配置文件。Collect,Enrich和Transport的行爲在配置文件中定義。配置文件的格式有點像json。
下面來建立一個logstash_index.conf文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
$ cat /usr/local/elk/logstash-5.4.1/etc/logstash_index.conf
input {
kafka {
#codec => "json"
topics_pattern => "elk-.*"
bootstrap_servers => "127.0.0.1:9092"
auto_offset_reset => "latest"
group_id => "logstash-g1"
}
}
output {
elasticsearch { #Logstash輸出到elasticsearch;
hosts => ["localhost:9200"] #elasticsearch爲本地;
index => "logstash-nginx-%{+YYYY.MM.dd}" #建立索引;
document_type => "nginx" #文檔類型;
workers => 1 #進程數量;
user => elastic #elasticsearch的用戶;
password => changeme #elasticsearch的密碼;
flush_size => 20000
idle_flush_time => 10
}
}
|
如上配置文件,input定義了從Redis中讀取數據;而output我是輸出到了本地的elasticsearch中存儲。
Logstash傳遞的每條數據都帶有元數據,如@version,@timestamp,host等等,有些能夠修改,有些不容許修改。host記錄的是當前的主機信息。Logstash可能不會去獲取主機的信息或者獲取的不許,這裏建議替換成本身定義的主機標識,以保證最終的日誌輸出能夠有完美的格式。
另外我這裏添加了elasticsearch的用戶名和密碼,由於後面我使用了x-pack插件,默認用戶名是elastic,密碼是changeme。
啓動Logstash:
1
|
$ nohup /usr/local/elk/logstash-5.4.1/bin/logstash -f /usr/local/elk/logstash-5.4.1/etc/logstash_index.conf &
|
8. 安裝使用Elastcearch
1
|
$ tar xvf elasticsearch-5.4.1.tar.gz -C /usr/local/elk/
|
同Logstash同樣,解壓完就可使用了。可是注意使用elasticsearch不能使用root用戶,因此這裏我建立了一個elk用戶,把elasticsearch.2.3.2目錄及子目錄的屬主和屬組改成elk用戶了。
1
2
|
$ useradd elk
$ chown elk.elk -R /usr/local/elk/elasticsearch-5.4.1
|
修改elasticsearch配置文件,添加以下幾行(注意開啓network.host):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
$ cat /usr/local/elk/elasticsearch-5.4.1/config/elasticsearch.yml
# ---------------------------------- Cluster -----------------------------------
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
node.name: node-1
#node.attr.rack: r1
# ----------------------------------- Paths ------------------------------------
path.data: /data/elasticsearch/
path.logs: /var/log/elasticsearch/
# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: false
# ---------------------------------- Network -----------------------------------
network.host: 0.0.0.0
http.port: 9200
# --------------------------------- Discovery ----------------------------------
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
#discovery.zen.minimum_master_nodes: 3
# ---------------------------------- Gateway -----------------------------------
#gateway.recover_after_nodes: 3
<span class="pl-ent">indices.memory.index_buffer_size</span>: <span class="pl-s">15%</span>
|
指定文檔和日誌的存儲路徑以及監聽的地址和端口。注意,應當保證有足夠的磁盤空間來存儲文檔,不然ES將拒絕寫入新數據。
建立elasticsearch須要的數據目錄和日誌目錄。
1
2
3
4
|
$ mkdir -p /data/elasticsearch
$ mkdir -p /var/log/elasticsearch/
$ chown elk.elk /data/elasticsearch/ -R
$ chown elk.elk /var/log/elasticsearch/ -R
|
啓動elasticsearch
1
|
$ nohup sudo -u elk /usr/local/elk/elasticsearch-5.4.1/bin/elasticsearch &
|
1
2
|
$ netstat -nplt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 5026/java
|
若是啓動Elasticsearch出現如下錯誤提示:
錯誤1:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
解決:打開/etc/security/limits.conf文件,添加如下兩行代碼並保存:
1
2
|
* soft nofile 65536 //*表示任意用戶,這裏是elasticsearch報的錯,也能夠直接填運行elk的用戶;
* hard nofile 131072
|
錯誤2:memory locking requested for elasticsearch process but memory is not locked
解決:修改elasticsearch.yml文件
1
|
bootstrap.memory_lock : false
|
錯誤3:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決:修改內核配置
1
2
|
$ sysctl -w vm.max_map_count=262144
$ sysctl -p
|
錯誤4:os::commit_memory(0x00000001006cd000, 77824, 0) failed; error=’Cannot allocate memory’ (errno=12)
解決:提供內存不足,增大主機內存或減少elasticsearch的內存大小
JVM默認配置參數:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$ grep -v "^#" /usr/local/elk/elasticsearch-5.4.1/config/jvm.options | grep -v "^$"
-Xms1g
-Xmx1g
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-server
-Xss1m
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
-XX:+HeapDumpOnOutOfMemoryError
|
而後使用curl訪問http://localhost:9200/?pretty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ curl http://localhost:9200/?pretty
{
"name" : "node-1",
"cluster_name" : "my-application",
"cluster_uuid" : "Jf0qp0GqQ_W1MHN4pDtLdA",
"version" : {
"number" : "5.4.1",
"build_hash" : "2cfe0df",
"build_date" : "2017-05-29T16:05:51.443Z",
"build_snapshot" : false,
"lucene_version" : "6.5.1"
},
"tagline" : "You Know, for Search"
}
|
若是能夠看到相似上面的返回,則說明ES單機運行沒有問題了。
安裝x-pack插件
x-pack是elasticsearch的一個擴展包,將安全,警告,監視,圖形和報告功能捆綁在一個易於安裝的軟件包中,雖然x-pack被設計爲一個無縫的工做,可是你能夠輕鬆的啓用或者關閉一些功能。
1
|
$ /usr/local/elk/elasticsearch-5.4.1/bin/elasticsearch-plugin install x-pack
|
ES若是是一個集羣,須要在每個節點上安裝(包括kibana)。
用戶和權限管理
x-pack安裝以後有一個超級用戶elastic ,其默認的密碼是changeme,擁有對全部索引和數據的控制權,可使用該用戶建立和修改其餘用戶,固然這裏能夠經過kibana的web界面進行用戶和用戶組的管理。
X-pack的elk之間的數據傳遞保護
安裝完x-pack以後,咱們就能夠用咱們所建立的用戶來保護elk之間的數據傳遞
1:kibana<——>elasticsearch
在kibana.yml文件中配置:
1
2
|
elasticsearch.username: "elastic"
elasticsearch.password: "changeme"
|
2:logstash<——>elasticsearch
1
2
3
4
5
6
7
|
output {
elasticsearch {
hosts => ["http://localhost:9200"]
user => elastic
password => changeme
}
}
|
這裏若是不進行相關配置的話,elk之間的數據傳遞就會出現問題。
安裝Cerebro
Cerebro時一個第三方的Elasticsearch集羣管理軟件,能夠方便地查看集羣狀態:
1
|
$ tar xvf cerebro-0.6.5.tgz -C /usr/local/elk/
|
下載地址(下載二進制版):https://github.com/lmenezes/cerebro
啓動進程:
1
|
$ nohup /usr/local/elk/cerebro-0.6.5/bin/cerebro -Dhttp.port=1234 -Dhttp.address=0.0.0.0 &
|
能夠在瀏覽器查看,須要輸入elasticsearch的用戶和密碼(若是安裝了x-pack)。
能夠在管理後臺修改模板,優化索引配置,例如:
安裝head插件
因爲elasticsearch 5.0版本變化較大,目前elasticsearch 5.0暫時不支持直接安裝head插件,可是head做者提供了另外一種安裝方法。推薦使用docker直接安裝elasticsearch-head。
1
|
$ docker run -p 9100:9100 -d mobz/elasticsearch-head:5
|
Docker須要自行安裝便可,另外因爲elasticsearch安裝了x-pack,因此elasticsearch有密碼。head鏈接elasticsearch須要帳號密碼。
1
|
http://localhost:9100/?auth_user=elastic&auth_password=changeme
|
8. 安裝kibana
Kibana安裝跟logstash、elasticsearch同樣不須要安裝,解壓就能用。
1
|
$ tar xvf kibana-5.4.1-linux-x86_64.tar.gz -C /usr/local/elk
|
安裝x-pack
1
2
3
4
5
6
7
8
9
10
|
$ /usr/local/elk/kibana-5.4.1-linux-x86_64/bin/kibana-plugin install x-pack
Attempting to transfer from x-pack
Attempting to transfer from https://artifacts.elastic.co/downloads/kibana-plugins/x-pack/x-pack-5.4.1.zip
Transferring 119988917 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete
|
調整配置文件,主要配置一下下面三個參數:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$ cat /usr/local/elk/kibana-5.4.1-linux-x86_64/config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
server.basePath: ""
server.maxPayloadBytes: 1048576
elasticsearch.url: "http://127.0.0.1:9200"
elasticsearch.preserveHost: true
kibana.index: ".kibana"
elasticsearch.pingTimeout: 1500
elasticsearch.requestTimeout: 30000
elasticsearch.shardTimeout: 0
elasticsearch.startupTimeout: 5000
pid.file: /var/run/kibana.pid
logging.dest: stdout
logging.silent: false
logging.quiet: false
logging.verbose: false
ops.interval: 5000
i18n.defaultLocale: "en"
# elasticsearch.username: "user"
# elasticsearch.password: "pass"
|
啓動Kibana
1
|
$ nohup /usr/local/elk/kibana-5.4.1-linux-x86_64/bin/kibana &
|
1
2
|
$ netstat -nplt | grep node
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 12471/node
|
而後打開瀏覽器輸入IP加端口5601便可訪問,界面以下(須要輸入用戶密碼了):
默認帳號:elastic
默認密碼:changeme
x-pack安裝以後有一個超級用戶elastic ,其默認的密碼是changeme,擁有對全部索引和數據的控制權,可使用該用戶建立和修改其餘用戶。
初次訪問Kibana的時候,須要配置一個默認的ES索引,通常填寫.monitoring*便可,這是由於在上述安裝x-pack後,會自動開始監控Elasticsearch集羣的狀態,並將監控結果以.monitoring*命名索引文件。
添加logstash索引(Management->index Patterns->+)
看日誌已經出來了。
ELK的搭建已經基本完成,接下來就是搭建elasticsearch集羣,以及使用kibana了。
X-PACK使用
x-pack的監控功能
X-Pack監控組件使您可以經過Kibana輕鬆監控Elasticsearch,您能夠實時查看集羣運行情況和性能,以及分析過去的集羣,索引和節點指標。 此外,您能夠監控Kibana自己的性能。在羣集上安裝X-Pack時,監視代理會在每一個節點上運行,以從Elasticsearch收集索引指標。 經過在Kibana中安裝X-Pack,您能夠經過一組專用儀表板查看監視數據。
x-pack的Graph
https://www.elastic.co/guide/en/x-pack/current/graph-getting-started.html
若是嫌使用kafka當隊列太麻煩,能夠把Kafka換成Redis便可,配置以下:
filebeat配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
filebeat.prospectors:
- input_type: log
paths:
- /var/log/*.log
- input_type: log
paths:
- /var/log/nginx/*.log
encoding: utf-8
document_type: my-nginx-log
scan_frequency: 10s
harvester_buffer_size: 16384
max_bytes: 10485760
tail_files: true
output.redis:
enabled: true
hosts: ["127.0.0.1:6379"]
port: 6379
key: filebeat
db: 0
worker: 1
timeout: 5s
max_retries: 3
|
logstash配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
input {
redis { #去redis隊列取數據;
host => "localhost" #鏈接redis服務器;
port => 6379 #鏈接redis端口;
data_type => "list" #數據類型;
key => "filebeat" #隊列名稱;
}
}
output {
elasticsearch { #Logstash輸出到elasticsearch;
hosts => ["localhost:9200"] #elasticsearch爲本地;
index => "logstash-nginx-%{+YYYY.MM.dd}" #建立索引;
document_type => "nginx" #文檔類型;
workers => 1 #進程數量;
flush_size => 20000
idle_flush_time => 10
user => elastic
password => changeme
}
}
|
查看Redis隊列信息
1
2
3
4
5
|
$ redis-cli
127.0.0.1:6379> KEYS *
1) "filebeat"
127.0.0.1:6379> llen filebeat
(integer) 2
|
Redis要自行安裝了。
把Nginx日誌的格式輸出成JSON格式展現在Kibana面板,生產環境中基本都是這麼使用。
配置Nginx
主要修改nginx的訪問日誌格式,這裏定義成json格式,以便後面logstash更好的處理,建議生產環境也這樣使用。在主配置/etc/nginx/nginx.conf文件中添加以下內容(註釋其餘日誌格式):
1
2
3
4
5
6
7
8
9
10
11
12
|
log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
|
在/etc/nginx/conf.d/default.conf中添加以下一行,定義nginx日誌使用的格式,以及日誌文件的位置。
1
|
access_log /var/log/nginx/access.log json;
|
而後從新啓動nginx
1
2
|
$ nginx -s stop
$ nginx
|
配置Logstash
修改Indexer角色的配置文件:logstash_indexer.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
$ cat /usr/local/logstash-2.3.2/etc/logstash_indexer.conf
input {
redis {
host => "localhost"
data_type => "list"
key => "filebeat"
type => "redis-input"
}
}
filter {
json {
source => "message"
remove_field => "message"
}
}
output {
elasticsearch {
hosts => ["localhost"]
index => "logstash-nginx-%{+YYYY.MM.dd}"
document_type => "nginx"
# template => "/usr/local/logstash-2.3.2/etc/elasticsearch-template.json"
workers => 1
flush_size => 20000
idle_flush_time => 10
}
}
|
刪除elasticsearch老的數據
1
|
$ rm -fr /data/elasticsearch/*
|
而後重啓logstash_indexer.conf和elastisearch便可,繼續刷新Nginx日誌。
打開Kibana,應該會讓你從新建立索引,若是沒有問題會出現JSON格式的日誌。
參考:http://www.jianshu.com/p/f3658d267b5d