docker-compose 搭建ELK
本文主要是參考別人博客,并迭代記錄一些原文沒有遇到或者說明的問題,供自己以后有相關問題來查看,并分享給大家
個人而言,docker-compose 相對 docker 分開部署簡單,可以一步到位。所以選擇docker-compose搭建。
如果有遇到什么問題,請查看最后的問題記錄!
環境說明
? 云機-Debian10
docker 安裝
? 請參考:https://www.runoob.com/docker/debian-docker-install.html,講的非常好!
docker-compose安裝
? 請參考:https://www.runoob.com/docker/docker-compose.html,這里我也再次說明一下吧。<u>主要解決服務器從github下載會很慢的問題。所以下面將直接從github下載,再復制到服務器上</u>
-
直接從github安裝
下載地址:https://github.com/docker/compose/releases,選定一個版本然后下載。
下載docker-compose-Linux-x86_64 linux的版本
-
將下載的文件復制到云機上(使用scp或者用圖形化界面都可以)
scp ./docker-compose-Linux-x86_64 root@192.168.1.13:/usr/local/bin/docker-compose
-
賦予可執行權限
如何debian提示sudo command not found,直接不用sudo或者安裝一個:apt-get install sudo
sudo chmod +x /usr/local/bin/docker-compose
-
創建軟鏈
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
-
測試安裝是否成功
docker-compose --version
安裝ELK環境
-
安裝ELK
-
創建ELK的docker-compose目錄
mkdir /usr/software/elk
-
從github拉取搭建ELK的腳本
該項目是使用Docker和Docker Compose 運行最新版本的[Elastic Stack]
git clone https://github.com/deviantony/docker-elk.git
-
進入剛剛clone下來的文件夾
cd docker-elk
-
啟動容器
首次啟動最好不要后臺啟動(守護進程),我們最好直接查看他啟動的日志情況:
方式1(可以查看到日志,首次創建最好使用這個,等觀察啟動沒問題再使用后臺啟動):
docker-compose up
方式1(守護進程):
docker-compose up -d
一般控制臺沒有異常輸出,那么就代表啟動成功了:
Successfully started Logstash API endpoint {:port=>9600}
查看docker容器運行狀況:
docker ps
1582855756(1).jpg
-
各個服務端口運行情況如下:
名稱 | 端口 | 說明 |
---|---|---|
Logstash TCP input | 5000 | 用于應用傳入數據進入logstash的端口 |
Elasticsearch HTTP | 9200 | 是ES節點與外部通訊使用的端口。它是http協議的RESTful接口;各種CRUD操作都是走的該端口,如查詢:http://localhost:9200/user/_search |
Elasticsearch TCP transport | 9300 | 是ES節點之間通訊使用的端口。它是tcp通訊端口,集群間和TCPclient都走的它。java程序中使用ES時,在配置文件中要配置該端口 |
Kibana | 5601 | Kibana的Web界面入口 |
-
登入Kibana 界面
下面就是可以見到成果的時候了!在網頁輸入服務器的地址:http://192.168.1.13:5601。
登入默認的就是es的用戶密碼,用戶名:elastic,密碼:changeme
如果是云機的外網ip,而且沒辦法連通的話,那么優先考慮云機服務商的安全組的配置,再考慮防火墻,Debian本身的沒有開啟防火墻的。所以,麻煩到云服務商的安全組配置,開放5601接口
-
配置ELK參數,讓spring boot應用的日志可以輸入到logstash中
-
進入logstash配置文件所在目錄
cd /home/xijie/app/myelk/dokcer-elk/logstash/pipeline
-
打開配置文件
vim logstash.conf
-
修改內容如下:
這里和原來的博文區別就在于,添加了es的權限驗證,因為docker-compose中默認開啟了 X-Pack的安全驗證,如果不添加啟動會沒辦法連接上的
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} } }
參數說明參考文章:
標簽 說明 input(logstash進數據接口) 使用的是tcp,說明springboot客戶端需要將日志傳遞到該接口,該接口正是logstash服務器接口。 filter(數據過濾器) 將message字段去掉,只是為了當展示springboot的http請求接口的數據更加規整,而不是全部展示在message字段中 output(數據出去接口) 將數據傳遞給了elasticsearch,這里使用了if,當判斷所出數據為所指定tag,才進行下面的配置。特別要注意index的配置,該值在kibana中需要使用,這里指定的index值為:data-http,要注意該值與tag是沒有關系的,要注意區分。 -
返回源目錄,重啟容器
cd /usr/software/elk/docker-elk docker-compose restart
-
-
配置spring-boot應用
-
添加logstash依賴
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.2</version> </dependency>
-
添加logstash配置,修改/添加logback.xml文件,內容如下:
這里盡量簡單,就是為了打通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 服務地址,可以寫成配置的形式,但是為了方便,就直接寫死在這里--> <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"/><!--同時輸出到控制臺--> </logger> </configuration>
-
在業務代碼中,使用配置好的elk_logger打印,就可以同時把日志輸出到logstash,并且存入ES了。
.... import org.slf4j.Logger; import org.slf4j.LoggerFactory; .... private static Logger logger = LoggerFactory.getLogger("elk_logger");//必須是這個名字 ... logger.info("我是一個簡易的spring-boot連接ELK的應用"); ...
以上完整的例子代碼在這里:github
-
-
配置Kibana,現在只要服務器通過指定的Tag打印日志,日志信息將會上傳logstash解析,并且存儲到elasticsearch,然后只需要kibana配置對應的elasticsearch的index即可看到所需的日志信息。
通過瀏覽器訪問kibana,http://192.168.1.13:5601,然后點擊最下面的management,再點擊Kibana的index_patterns
? 創建index_patterns
?? 接下來,在index pattern框中填入上述創建ElK時logstash配置文件中的index信息:data-http-*
? 注意!如果ES沒有數據是無法添加索引的!所以要確保之前的操作能夠成功,如果不能寫入,請查看文章最下面的參考。
? 選擇@timestamp字段作為時間篩選字段。
? 點擊最上面的指南針的圖標(Discover),然后選中data-http*索引就能夠看到對應的日志了。
?以上,spring-boot結合ELK的系統就搭建完成了!
錯誤記錄
我在搭建的過程中,遇到了以下的坑,浪費了我比較多時間
-
spring-boot無法寫入logstash,但是spring-boot應用能正常啟動,Kibana頁面能夠正常訪問。
這種情況,一般不會是應用的問題,因為應用部分配置非常簡單!就算有錯,在啟動的時候也會非常明顯,所以很有可能就是在ELK服務那邊。
查看ELK日志
這一點,很重要!我就是一個個ELK服務看日志,才發現了問題,日志體現如下:不斷的刷日志;出現以下錯誤:
[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
以上的日志的原因是,貌似有多個logstash實例同時啟動在同一端口,導致了死循環。可以參考: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!
對于我,原因如下:
我把原來的logstash的配置備份一份,文件結構如下:
logstash.conf logstash.conf.bak
于是,我就把logstash.conf.bak刪除,再啟動就可以了!
-
logstash啟動失敗,logstash連接es失敗
日志表現如下:
[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的權限驗證信息
vi /home/xijie/app/myelk/dokcer-elk/logstash/pipeline/logstash.conf
內容如下:
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} } }
以上關鍵在于,添加了es的user和password:
elasticsearch{ hosts=> ["elasticsearch:9200"] index => "data-http-%{+YYYY.MM.dd}" user => "elastic" password => "changeme" }
總結
? 通過docker-compose能夠快速的搭建ELK環境,然后再通過logstash的jar可以非常方便的將應用的日志推送到logstash,下面我會繼續熟悉Kibana的使用。
參考
docker部署ELK(logstash、elasticsearch、kibana),監控日志
https://github.com/deviantony/docker-elk/issues/446