SpringBoot進階教程(七十四)整合ELK
- 2022 年 5 月 21 日
- 筆記
- ELK, Spring Boot, springboot
在上一篇文章《SpringBoot進階教程(七十三)整合elasticsearch 》,已經詳細介紹了關於elasticsearch的安裝與使用,現在主要來看看關於ELK的定義、安裝及使用。
v簡介
1.什麼是ELK?
ELK 是elastic公司提供的一套完整的日誌收集以及展示的解決方案,是三個產品的首字母縮寫,分別是ElasticSearch、Logstash 和 Kibana。
ElasticSearch:ElasticSearch簡稱ES,它是一個實時的分散式搜索和分析引擎,它可以用於全文搜索,結構化搜索以及分析。它是一個建立在全文搜索引擎Apache Lucene基礎上的搜索引擎,使用Java語言編寫。關於ES的更多介紹,可以看看《SpringBoot進階教程(七十三)整合elasticsearch 》
Logstash:Logstash是一個具有實時傳輸能力的數據收集引擎,用來進行數據收集(如:讀取文本文件)、解析,並將數據發送給ES。
Kibana:Kibana為Elasticsearch提供了分析和可視化的Web平台。它可以在Elasticsearch的索引中查找,交互數據,並生成各種維度表格、圖形。
2.ELK的用途
2.1問題排查:我們常說,運維和開發這一輩子無非就是和問題在戰鬥,所以這個說起來很樸實的四個字,其實是沉甸甸的。很多公司其實不缺錢,就要穩定,而要穩定,就要運維和開發能夠快速的定位問題,甚至防微杜漸,把問題殺死在搖籃里。日誌分析技術顯然問題排查的基石。基於日誌做問題排查,還有一個很帥的技術,叫全鏈路追蹤,比如阿里的eagleeye 或者Google的dapper,也算是日誌分析技術里的一種。
2.2監控和預警:日誌,監控,預警是相輔相成的。基於日誌的監控,預警使得運維有自己的機械戰隊,大大節省人力以及延長運維的壽命。
2.3關聯事件:多個數據源產生的日誌進行聯動分析,通過某種分析演算法,就能夠解決生活中各個問題。比如金融里的風險欺詐等。這個可以可以應用到無數領域了,取決於你的想像力。
2.4數據分析:這個對於數據分析師,還有演算法工程師都是有所裨益的。
vdocker安裝elk
1. 拉取鏡像
docker pull elasticsearch:7.5.1
docker pull logstash:7.5.1
docker pull kibana:7.5.1
注意各個版本盡量保持一致,否則可能會報錯。
2. 創建docker-compose.yml
因為elk涉及到多個鏡像,所以使用docker-compose的方式,會比較方便。如果還沒有安裝docker-compose的,可以看看這篇文章。
創建目錄: mkdir /usr/local/docker/elk
創建docker-compose.yml文件 vi docker-compose.yml
version: '3'
services:
elasticsearch:
image: elasticsearch:7.5.1
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch" #設置集群名稱為elasticsearch
- "discovery.type=single-node" #以單一節點模式啟動
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #設置使用jvm記憶體大小
volumes:
- /usr/local/docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件掛載
- /usr/local/docker/elk/elasticsearch/data:/usr/share/elasticsearch/data #數據文件掛載
ports:
- 9200:9200
kibana:
image: kibana:7.5.1
container_name: kibana
depends_on:
- elasticsearch #kibana在elasticsearch啟動之後再啟動
environment:
- ELASTICSEARCH_URL=//elasticsearch:9200 #設置訪問elasticsearch的地址
ports:
- 5601:5601
logstash:
image: logstash:7.5.1
container_name: logstash
volumes:
- /usr/local/docker/elk/logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf #掛載logstash的配置文件
depends_on:
- elasticsearch #kibana在elasticsearch啟動之後再啟動
links:
- elasticsearch:es #可以用es這個域名訪問elasticsearch服務
ports:
- 4560:4560
!wd
保存。
3. 創建logstash-springboot.conf
創建 logstash目錄 mkdir /usr/local/docker/elk/logstash
cd logstash
進入logstash 目錄
創建logstash-springboot.conf配置文件 vi logstash-springboot.conf
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "springboot-logstash-%{+YYYY.MM.dd}"
}
}
cd ..
返回上一級目錄,即回到docker-compose所在的目錄( /usr/local/docker/elk
)。
4. 啟動ELK
docker-compose up -d
訪問Kibana(訪問地址://ip:5601),會看到異常資訊 Cannot connect to the Elasticsearch cluster currently configured for Kibana.
再通過 docker ps -a
發現elasticsearch實例掛了。
通過 docker logs -f elasticsearch
可以看到,es容器里的/usr/share/elasticsearch/data/nodes文件夾目錄沒有讀寫許可權,實際上是沒有宿主機/usr/local/es/data的讀寫許可權。
chmod 777 /usr/local/docker/elk/elasticsearch/data
然後重啟一下 docker-compose restart
請求url //toutou.com:5601
,搞定。
注意:如果啟動ELK之後馬上請求url,會提示 Kibana server is not ready yet
,等一會就好了。因為ELK三個應用之間創建連接也需要一點時間。
vspringboot整合elk
1. 添加引用
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.2</version> </dependency>
2. 添加logback.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> <!--應用名稱--> <property name="APP_NAME" value="myshop-demo-elk"/> <!--日誌文件保存路徑--> <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/> <contextName>${APP_NAME}</contextName> <!--每天記錄日誌到文件appender--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <!--輸出到logstash的appender--> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!--可以訪問的logstash日誌收集埠--> <destination>toutou.com:4560</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> <appender-ref ref="LOGSTASH"/> </root> </configuration>
注意:appender節點下的destination需要改成自己的logstash服務地址,比如我的是:toutou.com:4560
如果logback.xml不知道怎麼配的話,可以看看這篇文章:SpringBoot入門教程(八)配置logback日誌
3. 添加測試Controller
/** * @author toutou * @date by 2021/2 * @des //www.cnblogs.com/toutou */ @Slf4j @RestController public class IndexController { @GetMapping("/elk") public Result index() { String message = "logback ELK成功接入了,時間:" + new Date(); log.info(message); return Result.setSuccessResult(message); } }
關於springboot的整合就可以了,然後啟動SpringBoot應用就行。
v配置kibana
請求url //toutou.com:5601
,點擊Explore on my own。
1. 創建索引
依次按上圖中的步驟創建索引。
2. 查看收集日誌
3. 添加過濾條件,查找符合條件的日誌
4. 添加過濾條件
通過日誌查詢,我們會發現有很多debug的無效日誌,這種日誌可能不是太需要,而且會影響我們查詢真正有用的日誌。這樣我們就可以在收集日誌的時候,修改logstash-springboot.conf配置,通過logstash-springboot.conf來移除debug級別的日誌。更新後的配置如下:
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
if [level] != "ERROR" {
elasticsearch {
hosts => "es:9200"
index => "springboot-logstash-%{+YYYY.MM.dd}"
}
}
}
vkibana漢化
1. 進入kibana容器
docker exec -it kibana /bin/bash
2. 編輯文件
vi /opt/kibana/config/kibana.yml
修改該文件 在文件最後加上一行配置
i18n.locale: zh-CN
注意:zhe-CN和:號之間必須有個空格,否則kibana無法啟動
重啟,即可看到訪問的 kibana已漢化。
v源碼地址
//github.com/toutouge/javademosecond/tree/master/hellolearn
作 者:請叫我頭頭哥
出 處://www.cnblogs.com/toutou/
關於作者:專註於基礎平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援部落客:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
<script type=”text/javascript”>// </script>