ELK搭建
ELK是Elasticsearch、Logstash、Kibana的簡(jiǎn)稱,這三者是核心套件實(shí)現(xiàn)日志采集、分析、展示,但并非全部。
Elasticsearch是實(shí)時(shí)全文搜索和分析引擎,提供搜集、分析、存儲(chǔ)數(shù)據(jù)三大功能;是一套開放REST和JAVA API等結(jié)構(gòu)提供高效搜索功能,可擴(kuò)展的分布式系統(tǒng)。它構(gòu)建于Apache Lucene搜索引擎庫之上。
Logstash是一個(gè)用來搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統(tǒng)日志、錯(cuò)誤日志和自定義應(yīng)用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數(shù)據(jù),包括電子郵件、websockets和Elasticsearch。
Kibana是一個(gè)基于Web的圖形界面,用于搜索、分析和可視化存儲(chǔ)在 Elasticsearch指標(biāo)中的日志數(shù)據(jù)。它利用Elasticsearch的REST接口來檢索數(shù)據(jù),不僅允許用戶創(chuàng)建他們自己的數(shù)據(jù)的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數(shù)據(jù)。
一、參考資料
- 官網(wǎng)地址
- http://mirrors.aliyun.com/centos
- https://github.com/medcl/elasticsearch-analysis-ik/releases
- https://www.cnblogs.com/William-Guozi/p/elk-docker.html
- https://www.cnblogs.com/peterpoker/p/9573720.html
- https://www.cnblogs.com/just-coder/p/11017050.html
- logback中使用logstash配置說明
二、下載相關(guān)的docker鏡像
docker pull elasticsearch:7.6.0
docker pull kibana:7.6.0
docker pull logstash:7.6.0
docker pull mobz/elasticsearch‐head:5
三、 安裝elasticsearch
創(chuàng)建一個(gè)elk文件夾, 后面的elk日志采集系統(tǒng)的配置文件都放在這里面
mkdir /home/elk
創(chuàng)建elasticsearch配置文件
vi /home/elk/elasticsearch.yml
在里面添加如下配置:
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 訪問ID限定,0.0.0.0為不限制,生產(chǎn)環(huán)境請(qǐng)?jiān)O(shè)置為固定IP
transport.host: 0.0.0.0
# elasticsearch節(jié)點(diǎn)名稱
node.name: node-1
# elasticsearch節(jié)點(diǎn)信息
cluster.initial_master_nodes: ["node-1"]
# 下面的配置是關(guān)閉跨域驗(yàn)證(可以不開啟)
http.cors.enabled: true
http.cors.allow-origin: "*"
創(chuàng)建并啟動(dòng)elasticsearch容器
docker run -di -p 9200:9200 -p 9300:9300 --name=elasticsearch -v /home/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.6.0
之后通過9200端口在瀏覽器上訪問(需要開啟外網(wǎng)訪問權(quán)限),有信息返回則成功;,像下面的信息:
{
"name" : "node-1",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "7jUr1QFPQcSbDGG4A4c5Og",
"version" : {
"number" : "7.6.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
"build_date" : "2020-02-06T00:09:00.449973Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
注意:如果需要添加插件時(shí),需要將容器的插件目錄映射到實(shí)際的路徑中或者通過命令(如安裝ik分詞器:
docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/)將其拷貝到容器中
可能遇到的問題
1. 啟動(dòng)成功后,過了一會(huì)就停止
這與我們剛才修改的配置有關(guān),因?yàn)閑lasticsearch在啟動(dòng)的時(shí)候會(huì)進(jìn)行一些檢查,比如最多打開的文件的個(gè)數(shù)以及虛擬內(nèi)存
區(qū)域數(shù)量等等,如果你放開了此配置,意味著需要打開更多的文件以及虛擬內(nèi)存(實(shí)際就是硬件配置達(dá)不到它的要求),所以我們還需要系統(tǒng)調(diào)優(yōu)。
-
修改/etc/security/limits.conf ,添加如下內(nèi)容:
* soft nofile 65536 * hard nofile 65536
nofile是單個(gè)進(jìn)程允許打開的最大文件個(gè)數(shù) soft nofile 是軟限制 hard nofile是硬限制
-
修改/etc/sysctl.conf,追加內(nèi)容
vm.max_map_count=655360
vm.max_map_count是限制一個(gè)進(jìn)程可以擁有的VMA(虛擬內(nèi)存區(qū)域)的數(shù)量
執(zhí)行下面命令 修改內(nèi)核參數(shù)馬上生效,之后重啟服務(wù)器和docker服務(wù)
sysctl ‐p
2. 啟動(dòng)失敗顯示如下日志信息
ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
這個(gè)是由于elasticsearch7是集群多節(jié)點(diǎn)的版本,需要在elasticsearch.yml中添加如下配置(我們已經(jīng)在上面配置了無需再處理):
# elasticsearch節(jié)點(diǎn)名稱
node.name: node-1
# elasticsearch節(jié)點(diǎn)信息
cluster.initial_master_nodes: ["node-1"]
3. 外網(wǎng)上已經(jīng)可以通過9200端口推送數(shù)據(jù)和查詢數(shù)據(jù),但是后面安裝的kibana等組件卻無法連
查看日志發(fā)現(xiàn)如下錯(cuò)誤
error=>"Elasticsearch Unreachable: [http://192.168.6.128:9200/][Manticore::...
這個(gè)問題通常是由于安裝在一臺(tái)機(jī)器上的docker容器,防火墻開啟的狀態(tài)下,docker容器內(nèi)部無法訪問宿主機(jī)服務(wù)(能夠訪問非宿主機(jī)的其他局域網(wǎng)計(jì)算機(jī)的服務(wù)),解決方法如下3種:
-
配置防火墻規(guī)則firewall-cmd --zone=public --add-port={port}/tcp --permanent,并重載防火墻規(guī)則firewall-cmd --reload
firewall-cmd --zone=public --add-port=9200/tcp --permanent firewall-cmd --reload 啟動(dòng)容器時(shí)使用--net host模式(docker的4種網(wǎng)絡(luò)模式:http://www.itdecent.cn/p/22a7032bb7bd)
關(guān)閉防火墻(不建議)
安裝elasticsearch‐head插件做調(diào)試使用(可以不安裝)
docker run ‐di ‐‐name=es-head ‐p 9100:9100 mobz/elasticsearch‐head:5
啟動(dòng)成功后訪問9100端口即可使用界面化進(jìn)行管理elasticsearch。
在本地電腦上安裝
下載head插件:
https://github.com/mobz/elasticsearch-head-
將grunt安裝為全局命令 。Grunt是基于Node.js的項(xiàng)目構(gòu)建工具。它可以自動(dòng)運(yùn)行你所 設(shè)定的任務(wù)
npm install ‐g grunt‐cli -
安裝依賴
npm install -
啟動(dòng)
grunt server
打開瀏覽器,輸入 http://localhost:9100
四、安裝kibana
kibana主要用于對(duì)elasticsearch的數(shù)據(jù)進(jìn)行分析查看。注意選擇的版本必須和elasticsearch的版本相同或者低,建議和elasticsearch的版本相同,否則會(huì)無法將無法使用kibana。
創(chuàng)建配置文件
vi /home/elk/kibana.yml
在里面編寫如下配置:
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch的IP:9200"]
# 操作界面語言設(shè)置為中文
i18n.locale: "zh-CN"
創(chuàng)建并啟動(dòng)kibana容器
docker run -di --name kibana -p 5601:5601 -v /home/elk/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.6.0
啟動(dòng)成功后訪問5601端口即可進(jìn)入kibana管理界面。(進(jìn)入后要求選擇配置,直接選擇自己瀏覽即可)
操作說明
剛進(jìn)入系統(tǒng)時(shí)會(huì)有如下提示,任意選擇即可

創(chuàng)建索引模式,以便我們可以查看日志信息




五、安裝logstash
logstash會(huì)將收到的日志信息推送到elasticsearch中
創(chuàng)建配置文件
vi /home/elk/logstash.conf
在里面添加如下配置:
input {
tcp {
port => 5044
# 輸入為json數(shù)據(jù)
codec => json_lines
}
}
filter {
}
output {
# 這個(gè)是logstash的控制臺(tái)打?。ㄟM(jìn)行安裝調(diào)試的時(shí)候開啟,稍后成功后去掉這個(gè)配置即可)
stdout {
codec => rubydebug
}
# elasticsearch配置
elasticsearch {
hosts => ["elasticsearch的IP:9200"]
# 索引名稱,沒有會(huì)自動(dòng)創(chuàng)建
index => "logstash-%{[server_name]}-%{+YYYY.MM.dd}"
}
}
%{[server_name]} 說明:這個(gè)是取輸入的json數(shù)據(jù)中的key為server_name值。
創(chuàng)建和啟動(dòng)logstash容器
docker run -di -p 5044:5044 -v /home/elk/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --name logstash logstash:7.6.0
將微服務(wù)的日志推送到logstash中
下面以springboot項(xiàng)目為例
添加maven依賴
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
下面以springboot中使用logback作為日志處理工具,配置文件(logback-spring.xml)配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制臺(tái)輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n</pattern>
</layout>
</appender>
<!--logback輸出-->
<appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.0.111:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 打印行號(hào)、方法名,官方不建議在生產(chǎn)環(huán)境開啟此配置,默認(rèn)為false(關(guān)閉),具網(wǎng)友測(cè)試開啟后的耗時(shí)是未開啟的大約360倍的時(shí)間(業(yè)務(wù)量小的時(shí)候可以忽略) -->
<includeCallerData>true</includeCallerData>
<!-- 設(shè)置時(shí)區(qū)-->
<timeZone>UTC</timeZone>
<!-- 日期格式化-->
<!-- <timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern>-->
<!-- 添加自定義屬性,這里的server_name是服務(wù)名-->
<customFields>{"server_name":"demo-server"}</customFields>
</encoder>
<!-- 設(shè)置超時(shí)時(shí)間, 默認(rèn)沒有,使用集群的時(shí)候可以加上-->
<!--<writeTimeout>30 seconds</writeTimeout>-->
</appender>
<root level="INFO">
<!--本地開發(fā)調(diào)試將控制臺(tái)輸出打開,同時(shí)將日志文件輸出關(guān)閉,提高日志性能;線上部署請(qǐng)務(wù)必將控制臺(tái)輸出關(guān)閉-->
<appender-ref ref="STDOUT"/>
<appender-ref ref="STASH"/>
</root>
</configuration>
更詳細(xì)的配置說明見官方文檔:https://github.com/logstash/logstash-logback-encoder
注意生產(chǎn)環(huán)境中請(qǐng)把權(quán)限相關(guān)驗(yàn)證配置上