ELK 是 elastic 公司旗下三款產品 ElasticSearch 、Logstash 、Kibana 的首字母組合。html
ElasticSearch 是一個基於 Lucene 構建的開源,分佈式,RESTful 搜索引擎。java
Logstash 傳輸和處理你的日誌、事務或其餘數據。linux
Kibana 將 Elasticsearch 的數據分析並渲染爲可視化的報表。git
對於有必定規模的公司來講,一般會不少個應用,並部署在大量的服務器上。運維和開發人員經常須要經過查看日誌來定位問題。若是應用是集羣化部署,試想若是登陸一臺臺服務器去查看日誌,是多麼費時費力。github
而經過 ELK 這套解決方案,能夠同時實現日誌收集、日誌搜索和日誌分析的功能。spring
以上是 ELK 技術棧的一個架構圖。從圖中能夠清楚的看到數據流向。docker
Beats 是單一用途的數據傳輸平臺,它能夠將多臺機器的數據發送到 Logstash 或 ElasticSearch。但 Beats 並非不可或缺的一環,因此本文中暫不介紹。apache
Logstash 是一個動態數據收集管道。支持以 TCP/UDP/HTTP 多種方式收集數據(也能夠接受 Beats 傳輸來的數據),並對數據作進一步豐富或提取字段處理。json
ElasticSearch 是一個基於 JSON 的分佈式的搜索和分析引擎。做爲 ELK 的核心,它集中存儲數據。windows
Kibana 是 ELK 的用戶界面。它將收集的數據進行可視化展現(各類報表、圖形化數據),並提供配置、管理 ELK 的界面。
ELK 要求本地環境中安裝了 JDK 。若是不肯定是否已安裝,可以使用下面的命令檢查:
java -version
本文使用的 ELK 是 6.0.0,要求 jdk 版本不低於 JDK8。
友情提示:安裝 ELK 時,三個應用請選擇統一的版本,避免出現一些莫名其妙的問題。例如:因爲版本不統一,致使三個應用間的通信異常。
安裝步驟以下:
bin/elasticsearch
(Windows 上運行 bin\elasticsearch.bat
)curl http://localhost:9200/
;windows 上能夠用訪問 REST 接口的方式來訪問 http://localhost:9200/安裝步驟以下:
logstash.conf
文件,指定要使用的插件以及每一個插件的設置。舉個簡單的例子:input { stdin { } } output { elasticsearch { hosts => \["localhost:9200"\] } stdout { codec => rubydebug } }
bin/logstash -f logstash.conf
(Windows 上運行bin/logstash.bat -f logstash.conf
)安裝步驟以下:
config/kibana.yml
配置文件,設置 elasticsearch.url
指向 Elasticsearch 實例。bin/kibana
(Windows 上運行 bin\kibana.bat
)**問題:**在 Linux 環境中,elasticsearch 不容許以 root 權限來運行。
若是以 root 身份運行 elasticsearch,會提示這樣的錯誤:
can not run elasticsearch as root
**解決方法:**使用非 root 權限帳號運行 elasticsearch
# 建立用戶組 groupadd elk # 建立新用戶,-g elk 設置其用戶組爲 elk,-p elk 設置其密碼爲 elk useradd elk -g elk -p elk # 更改 /opt 文件夾及內部文件的所屬用戶及組爲 elk:elk chown -R elk:elk /opt # 假設你的 elasticsearch 安裝在 opt 目錄下# 切換帳號 su elk
問題:vm.max_map_count
表示虛擬內存大小,它是一個內核參數。elasticsearch 默認要求 vm.max_map_count
不低於 262144。
max virtual memory areas vm.max\_map\_count \[65530\] is too low, increase to at least \[262144\]
解決方法:
你能夠執行如下命令,設置 vm.max_map_count
,可是重啓後又會恢復爲原值。
sysctl -w vm.max\_map\_count=262144
持久性的作法是在 /etc/sysctl.conf
文件中修改 vm.max_map_count
參數:
echo "vm.max\_map\_count=262144" > /etc/sysctl.conf sysctl -p
注意
若是運行環境爲 docker 容器,可能會限制執行 sysctl 來修改內核參數。
這種狀況下,你只能選擇直接修改宿主機上的參數了。
問題: nofile
表示進程容許打開的最大文件數。elasticsearch 進程要求能夠打開的最大文件數不低於 65536。
max file descriptors \[4096\] for elasticsearch process is too low, increase to at least \[65536\]
解決方法:
在 /etc/security/limits.conf
文件中修改 nofile
參數:
echo "* soft nofile 65536" > /etc/security/limits.conf echo "* hard nofile 131072" > /etc/security/limits.conf
問題: nproc
表示最大線程數。elasticsearch 要求最大線程數不低於 2048。
max number of threads \[1024\] for user \[user\] is too low, increase to at least \[2048\]
解決方法:
在 /etc/security/limits.conf
文件中修改 nproc
參數:
echo "* soft nproc 2048" > /etc/security/limits.conf echo "* hard nproc 4096" > /etc/security/limits.conf
**問題:**安裝 ELK 後,訪問 kibana 頁面時,提示如下錯誤信息:
Warning No default index pattern. You must select or create one to continue. ... Unable to fetch mapping. Do you have indices matching the pattern?
這就說明 logstash 沒有把日誌寫入到 elasticsearch。
解決方法:
檢查 logstash 與 elasticsearch 之間的通信是否有問題,通常問題就出在這。
本人使用的 Java 日誌方案爲 slf4j + logback,因此這裏以 logback 來說解。
修改 logstash.conf 配置
首先,咱們須要修改一下 logstash 服務端 logstash.conf 中的配置
input { # stdin { } tcp { # host:port就是上面appender中的 destination, # 這裏其實把logstash做爲服務,開啓9250端口接收logback發出的消息 host => "127.0.0.1" port => 9250 mode => "server" tags => ["tags"] codec => json_lines } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } }
說明
這個 input 中的配置實際上是 logstash 服務端監聽 9250 端口,接收傳遞來的日誌數據。
而後,在 Java 應用的 pom.xml 中引入 jar 包:
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.11</version> </dependency>
接着,在 logback.xml 中添加 appender
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppende> <!-- destination 是 logstash 服務的 host:port, 至關於和 logstash 創建了管道,將日誌數據定向傳輸到 logstash --> <destination>127.0.0.1:9250</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <logger name="io.github.dunwu.spring" level="TRACE" additivity="false"> <appender-ref ref="LOGSTASH" /> </logger>
大功告成,此後,io.github.dunwu.spring
包中的 TRACE 及以上級別的日誌信息都會被定向輸出到 logstash 服務。
[