docker-compose 搭建ELK
本文主要是參考別人博客橙数,并迭代記錄一些原文沒有遇到或者說明的問題,供自己以后有相關(guān)問題來查看奠旺,并分享給大家
個(gè)人而言响疚,docker-compose 相對(duì) docker 分開部署簡單忿晕,可以一步到位银受。所以選擇docker-compose搭建宾巍。
如果有遇到什么問題顶霞,請查看最后的問題記錄锣吼!
環(huán)境說明
? 云機(jī)-Debian10
docker 安裝
? 請參考:https://www.runoob.com/docker/debian-docker-install.html玄叠,講的非常好读恃!
docker-compose安裝
? 請參考:https://www.runoob.com/docker/docker-compose.html寺惫,這里我也再次說明一下吧胆数。<u>主要解決服務(wù)器從github下載會(huì)很慢的問題必尼。所以下面將直接從github下載判莉,再復(fù)制到服務(wù)器上</u>
-
直接從github安裝
下載地址:https://github.com/docker/compose/releases券盅,選定一個(gè)版本然后下載膛檀。
下載docker-compose-Linux-x86_64 linux的版本
-
將下載的文件復(fù)制到云機(jī)上(使用scp或者用圖形化界面都可以)
scp ./docker-compose-Linux-x86_64 root@192.168.1.13:/usr/local/bin/docker-compose
-
賦予可執(zhí)行權(quán)限
如何debian提示sudo command not found泳炉,直接不用sudo或者安裝一個(gè):apt-get install sudo
sudo chmod +x /usr/local/bin/docker-compose
-
創(chuàng)建軟鏈
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
-
測試安裝是否成功
docker-compose --version
安裝ELK環(huán)境
-
安裝ELK
-
創(chuàng)建ELK的docker-compose目錄
mkdir /usr/software/elk
-
從github拉取搭建ELK的腳本
該項(xiàng)目是使用Docker和Docker Compose 運(yùn)行最新版本的[Elastic Stack]
git clone https://github.com/deviantony/docker-elk.git
-
進(jìn)入剛剛clone下來的文件夾
cd docker-elk
-
啟動(dòng)容器
首次啟動(dòng)最好不要后臺(tái)啟動(dòng)(守護(hù)進(jìn)程)花鹅,我們最好直接查看他啟動(dòng)的日志情況:
方式1(可以查看到日志刨肃,首次創(chuàng)建最好使用這個(gè)真友,等觀察啟動(dòng)沒問題再使用后臺(tái)啟動(dòng)):
docker-compose up
方式1(守護(hù)進(jìn)程):
docker-compose up -d
一般控制臺(tái)沒有異常輸出盔然,那么就代表啟動(dòng)成功了:
Successfully started Logstash API endpoint {:port=>9600}
查看docker容器運(yùn)行狀況:
docker ps
1582855756(1).jpg
-
各個(gè)服務(wù)端口運(yùn)行情況如下:
名稱 | 端口 | 說明 |
---|---|---|
Logstash TCP input | 5000 | 用于應(yīng)用傳入數(shù)據(jù)進(jìn)入logstash的端口 |
Elasticsearch HTTP | 9200 | 是ES節(jié)點(diǎn)與外部通訊使用的端口轻纪。它是http協(xié)議的RESTful接口;各種CRUD操作都是走的該端口,如查詢:http://localhost:9200/user/_search |
Elasticsearch TCP transport | 9300 | 是ES節(jié)點(diǎn)之間通訊使用的端口刻帚。它是tcp通訊端口崇众,集群間和TCPclient都走的它。java程序中使用ES時(shí)锰蓬,在配置文件中要配置該端口 |
Kibana | 5601 | Kibana的Web界面入口 |
-
登入Kibana 界面
下面就是可以見到成果的時(shí)候了芹扭!在網(wǎng)頁輸入服務(wù)器的地址:http://192.168.1.13:5601舱卡。
登入默認(rèn)的就是es的用戶密碼轮锥,用戶名:elastic要尔,密碼:changeme
如果是云機(jī)的外網(wǎng)ip赵辕,而且沒辦法連通的話匆帚,那么優(yōu)先考慮云機(jī)服務(wù)商的安全組的配置吸重,再考慮防火墻,Debian本身的沒有開啟防火墻的颜矿。所以骑疆,麻煩到云服務(wù)商的安全組配置箍铭,開放5601接口
-
配置ELK參數(shù)诈火,讓spring boot應(yīng)用的日志可以輸入到logstash中
-
進(jìn)入logstash配置文件所在目錄
cd /home/xijie/app/myelk/dokcer-elk/logstash/pipeline
-
打開配置文件
vim logstash.conf
-
修改內(nèi)容如下:
這里和原來的博文區(qū)別就在于冷守,添加了es的權(quán)限驗(yàn)證,因?yàn)閐ocker-compose中默認(rèn)開啟了 X-Pack的安全驗(yàn)證亮钦,如果不添加啟動(dòng)會(huì)沒辦法連接上的
input{ tcp { mode => "server" port => 5000 codec => json_lines tags => ["data-http"] } } filter{ json{ source => "message" remove_field => ["message"] } } output{ if "data-http" in [tags]{ elasticsearch{ hosts=> ["elasticsearch:9200"] index => "data-http-%{+YYYY.MM.dd}" user => "elastic" password => "changeme" } stdout{codec => rubydebug} } }
參數(shù)說明參考文章:
標(biāo)簽 說明 input(logstash進(jìn)數(shù)據(jù)接口) 使用的是tcp,說明springboot客戶端需要將日志傳遞到該接口巡语,該接口正是logstash服務(wù)器接口淮菠。 filter(數(shù)據(jù)過濾器) 將message字段去掉合陵,只是為了當(dāng)展示springboot的http請求接口的數(shù)據(jù)更加規(guī)整拥知,而不是全部展示在message字段中 output(數(shù)據(jù)出去接口) 將數(shù)據(jù)傳遞給了elasticsearch低剔,這里使用了if襟齿,當(dāng)判斷所出數(shù)據(jù)為所指定tag猜欺,才進(jìn)行下面的配置拷窜。特別要注意index的配置,該值在kibana中需要使用笋妥,這里指定的index值為:data-http挽鞠,要注意該值與tag是沒有關(guān)系的信认,要注意區(qū)分嫁赏。 -
返回源目錄油挥,重啟容器
cd /usr/software/elk/docker-elk docker-compose restart
-
-
配置spring-boot應(yīng)用
-
添加logstash依賴
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.2</version> </dependency>
-
添加logstash配置攘乒,修改/添加logback.xml文件惋鹅,內(nèi)容如下:
這里盡量簡單闰集,就是為了打通spring-boot和logstash武鲁,打通了一切都好理解了沐鼠。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!--配置logStash 服務(wù)地址饲梭,可以寫成配置的形式排拷,但是為了方便,就直接寫死在這里--> <destination>192.168.1.13:5000</destination> <!-- 日志輸出編碼 --> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> <!--定義elk日志的名稱布蔗,需要上傳的則使用該logger--> <logger name="elk_logger" level="INFO" additivity="false"> <appender-ref ref="LOGSTASH"/><!--輸出到logstash--> <appender-ref ref="CONSOLE"/><!--同時(shí)輸出到控制臺(tái)--> </logger> </configuration>
-
在業(yè)務(wù)代碼中纵揍,使用配置好的elk_logger打印泽谨,就可以同時(shí)把日志輸出到logstash吧雹,并且存入ES了雄卷。
.... import org.slf4j.Logger; import org.slf4j.LoggerFactory; .... private static Logger logger = LoggerFactory.getLogger("elk_logger");//必須是這個(gè)名字 ... logger.info("我是一個(gè)簡易的spring-boot連接ELK的應(yīng)用"); ...
以上完整的例子代碼在這里:github
-
-
配置Kibana丁鹉,現(xiàn)在只要服務(wù)器通過指定的Tag打印日志妒潭,日志信息將會(huì)上傳logstash解析,并且存儲(chǔ)到elasticsearch揣钦,然后只需要kibana配置對(duì)應(yīng)的elasticsearch的index即可看到所需的日志信息雳灾。
通過瀏覽器訪問kibana台谢,http://192.168.1.13:5601俯邓,然后點(diǎn)擊最下面的management暑竟,再點(diǎn)擊Kibana的index_patterns
? 創(chuàng)建index_patterns
?? 接下來掺喻,在index pattern框中填入上述創(chuàng)建ElK時(shí)logstash配置文件中的index信息:data-http-*
? 注意樱溉!如果ES沒有數(shù)據(jù)是無法添加索引的构订!所以要確保之前的操作能夠成功,如果不能寫入空凸,請查看文章最下面的參考。
? 選擇@timestamp字段作為時(shí)間篩選字段寸痢。
? 點(diǎn)擊最上面的指南針的圖標(biāo)(Discover)呀洲,然后選中data-http*索引就能夠看到對(duì)應(yīng)的日志了。
?以上啼止,spring-boot結(jié)合ELK的系統(tǒng)就搭建完成了道逗!
錯(cuò)誤記錄
我在搭建的過程中,遇到了以下的坑献烦,浪費(fèi)了我比較多時(shí)間
-
spring-boot無法寫入logstash滓窍,但是spring-boot應(yīng)用能正常啟動(dòng),Kibana頁面能夠正常訪問巩那。
這種情況吏夯,一般不會(huì)是應(yīng)用的問題此蜈,因?yàn)閼?yīng)用部分配置非常簡單!就算有錯(cuò)噪生,在啟動(dòng)的時(shí)候也會(huì)非常明顯裆赵,所以很有可能就是在ELK服務(wù)那邊。
查看ELK日志
這一點(diǎn)跺嗽,很重要战授!我就是一個(gè)個(gè)ELK服務(wù)看日志,才發(fā)現(xiàn)了問題桨嫁,日志體現(xiàn)如下:不斷的刷日志植兰;出現(xiàn)以下錯(cuò)誤:
[2020-02-28T08:46:26,997][ERROR][io.netty.util.concurrent.DefaultPromise.rejectedExecution] Failed to submit a listener notification task. Event loop shut down? java.util.concurrent.RejectedExecutionException: event executor terminated
以上的日志的原因是,貌似有多個(gè)logstash實(shí)例同時(shí)啟動(dòng)在同一端口璃吧,導(dǎo)致了死循環(huán)钉跷。可以參考:https://github.com/elastic/elasticsearch/issues/27226肚逸,上面說
In case anyone (like me) lands here with the same error: check that you're not trying to run multiple instances of Logstash on the same port!
對(duì)于我爷辙,原因如下:
我把原來的logstash的配置備份一份,文件結(jié)構(gòu)如下:
logstash.conf logstash.conf.bak
于是朦促,我就把logstash.conf.bak刪除膝晾,再啟動(dòng)就可以了!
-
logstash啟動(dòng)失敗务冕,logstash連接es失敗
日志表現(xiàn)如下:
[2020-02-27T08:34:46,451][WARN ][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>"http://elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError, :error=>"Got response code '401' contacting Elasticsearch at URL 'http://elasticsearch:9200/'"}
解決方案:修改logstash.conf文件血当,添加es的權(quán)限驗(yàn)證信息
vi /home/xijie/app/myelk/dokcer-elk/logstash/pipeline/logstash.conf
內(nèi)容如下:
input{ tcp { mode => "server" port => 5000 codec => json_lines tags => ["data-http"] } } filter{ json{ source => "message" remove_field => ["message"] } } output{ if "data-http" in [tags]{ elasticsearch{ hosts=> ["elasticsearch:9200"] index => "data-http-%{+YYYY.MM.dd}" user => "elastic" password => "changeme" } stdout{codec => rubydebug} } }
以上關(guān)鍵在于,添加了es的user和password:
elasticsearch{ hosts=> ["elasticsearch:9200"] index => "data-http-%{+YYYY.MM.dd}" user => "elastic" password => "changeme" }
總結(jié)
? 通過docker-compose能夠快速的搭建ELK環(huán)境禀忆,然后再通過logstash的jar可以非常方便的將應(yīng)用的日志推送到logstash臊旭,下面我會(huì)繼續(xù)熟悉Kibana的使用。
參考
docker部署ELK(logstash箩退、elasticsearch离熏、kibana),監(jiān)控日志
https://github.com/deviantony/docker-elk/issues/446