SpringBoot進階教程(七十四)整合ELK
在上一篇文章 《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資料分析: 這個對於資料分析師,還有演算法工程師都是有所裨益的。
v docker安裝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=http://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(訪問地址:http://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 http://toutou.com:5601
,搞定。
注意:如果啟動ELK之後馬上請求url,會提示 Kibana server is not ready yet
,等一會就好了。因為ELK三個應用之間建立連線也需要一點時間。
v springboot整合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 http://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 http://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}" } } }
v kibana漢化
1. 進入kibana容器
docker exec -it kibana /bin/bash
2. 編輯檔案
vi /opt/kibana/config/kibana.yml
修改該檔案 在檔案最後加上一行配置
i18n.locale: zh-CN
注意:zhe-CN和:號之間必須有個空格,否則kibana無法啟動
重啟,即可看到訪問的 kibana已漢化。
v 原始碼地址
http://github.com/toutouge/javademosecond/tree/master/hellolearn
作者: 請叫我頭頭哥
出處: http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角 【 推薦 】 一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
<script type="text/javascript">// </script>
- 【演算法篇】刷了兩道大廠面試題,含淚 ”重學陣列“
- 2022 開源軟體安全狀況報告:超 41% 的企業對開源安全沒有足夠的信心
- JavaScript中async和await的使用以及佇列問題
- Flex & Bison 開始
- Obsidian基礎教程
- 分享自己平時使用的socket多客戶端通訊的程式碼技術點和軟體使用
- iNeuOS工業網際網路作業系統,增加2154個檢視建模(WEB組態)行業向量圖元、大屏背景及相關圖元
- 多臺雲伺服器的 Kubernetes 叢集搭建
- Elasticsearch學習系列四(聚合搜尋)
- 關於swiper外掛在vue2的使用
- 使用 Abp.Zero 搭建第三方登入模組(一):原理篇
- LVGL庫入門教程 - 顏色和影象
- Node.js精進(4)——事件觸發器
- 物聯網?快來看 Arduino 上雲啦
- SpringBoot JWT Redis 開源知識社群系統
- CVPR2022 | 可精簡域適應
- Spring框架系列(3) - 深入淺出Spring核心之控制反轉(IOC)
- 面試突擊59:一個表中可以有多個自增列嗎?
- CVPR2022 | 弱監督多標籤分類中的損失問題
- JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文帶你釐清箇中曲直,給你個選擇SpringDataJPA的...