作者:小凱
沉淀、分享、成長,讓自己和他人都能有所收獲!
本文的宗旨在于通過易于上手實操的方式,教會讀者完成系統ELK日志采集的對接和使用。那你知道對于一個系統的上線考察,必備的幾樣東西是什么嗎?其實這也是面試中考察求職者,是否真的做過系統開發和上線的必備問題。包括:服務治理(熔斷/限流) (opens new window)、監控 (opens new window)和日志,如果你做的系統里沒有這樣幾個東西,一種是說明系統是玩具項目,另外一種就是壓根沒做過或者沒關心過。前面的已經寫完了,所以今天來給大家寫ELK日志。
官網:https://www.elastic.co/cn/(opens new window)
一、簡要說明
Elastic Stack 技術棧,別是 Elasticsearch、Logstash、Kibana 組成,簡稱 ELK 是一套針對日志數據做解決方案的框架。它使您能夠聚合來自所有系統和應用程序的日志,分析這些日志,并創建可視化來進行應用程序和基礎設施監控、更快的故障排除、安全分析等。
- E = Elasticsearch:Elasticsearch 是在 Apache Lucene 上構建的分布式搜索和分析引擎。對各種語言、高性能和無架構 JSON 文檔的支持使 Elasticsearch 成為各種日志分析和搜索使用案例的理想選擇。
- L = Logstash:Logstash 是一個開源數據攝取工具,允許您從各種來源收集數據,轉換數據,并將數據發送到您希望的目標。通過預構建的篩選器和對 200 多種插件的支持,Logstash 使用戶能夠輕松攝取數據,無論數據源或類型如何。
- K = Kibana:Kibana 是一種數據可視化和挖掘工具,可以用于日志和時間序列分析、應用程序監控和運營智能使用案例。它提供了強大且易用的功能,例如直方圖、線形圖、餅圖、熱圖和內置的地理空間支持。此外,付費的 Kibana 還有 x-pack-jdbc 可以使用,讓你就像使用 MyBatis 操作 MySQL 數據庫一樣操作 Elasticsearch 數據。
綜上,3個組件的組合使用。由 Logstash 將攝取、轉換數據并將其發送到 Elasticsearch 為攝取的數據編制索引,并且分析和搜索這些數據。最終 Kibana 會將分析結果可視化。也就是你可以在 Kibana 上實時看到系統的運行日志。
二、環境配置
這里做了個工程案例,并配有對應的環境安裝、日志上報,你只需要跟隨接下來的文章說明,即可知道 ELK 如何配置和使用。
- 環境;jdk 1.8、Maven 3.6.x、Docker
- 組件;ELK version 7.17.14 支持 ARM&AMD
- 代碼;在 xfg-dev-tech-elk 測試工程中提供了測試代碼和環境安裝,綠色按鈕點擊即可安裝【確保你已經本地安裝了 Docker】
1. 環境配置
- docker-compose.yml 運行時會加載下面的 kibana、logstash 配置信息。
- kibana.yml 設置了資源的基本信息,包括 ES 的連接,中文漢化。
- logstash.conf 設置了日志的格式,上報到 es:9200 的地址信息。這些都可以保持默認不用修改。
2. 安裝環境
version: '3'
# 執行腳本;docker-compose -f docker-compose.yml up -d
# 控制臺;GET _cat/indices - 查看 springboot-logstash- 是否存在,上報后存在,則表示接入成功
services:elasticsearch:image: elasticsearch:7.17.14ports:- '9200:9200'- '9300:9300'container_name: elasticsearchrestart: alwaysenvironment:- 'cluster.name=elasticsearch' # 設置集群名稱為elasticsearch- 'discovery.type=single-node' # 以單一節點模式啟動- "cluster.name=docker-cluster" # 設置名稱- 'ES_JAVA_OPTS=-Xms512m -Xmx512m' # 設置使用jvm內存大小networks:- elklogstash:image: logstash:7.17.14container_name: logstashrestart: alwaysvolumes:- /etc/localtime:/etc/localtime- ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.confports:- '4560:4560'- '50000:50000/tcp'- '50000:50000/udp'- '9600:9600'environment:LS_JAVA_OPTS: -Xms1024m -Xmx1024mTZ: Asia/ShanghaiMONITORING_ENABLED: falselinks:- elasticsearch:es # 可以用es這個域名訪問elasticsearch服務networks:- elkdepends_on:- elasticsearch # 依賴elasticsearch啟動后在啟動logstashkibana:image: kibana:7.17.14container_name: kibanarestart: alwaysvolumes:- /etc/localtime:/etc/localtime- ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.ymlports:- '5601:5601'links:- elasticsearch:es #可以用es這個域名訪問elasticsearch服務environment:- ELASTICSEARCH_URL=http://elasticsearch:9200 #設置訪問elasticsearch的地址- 'elasticsearch.hosts=http://es:9200' #設置訪問elasticsearch的地址- I18N_LOCALE=zh-CNnetworks:- elkdepends_on:- elasticsearchnetworks:elk:driver: bridge #網絡
- 這是 docker compose 執行腳本,如果你本地已經安裝了 Docker 可以直接執行 安裝即可。
- 安裝完成后,當你看到如上截圖,則表示已經運行。注意 Quick Actions 下可以進入日志和控制臺。如果啟動失敗,可以檢查日志。
3. 日志配置
3.1 引入POM - logstash
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>7.3</version>
</dependency>
- 這個Jar是為了上報應用日志用的。工程的根目錄下引入是定義版本,在 xfg-dev-tech-app 模塊下引入是具體的引入。
3.2 logback 采集
# logstash部署的服務器IP
logstash:host: 127.0.0.1@小傅哥: 代碼已經復制到剪貼板<springProperty name="LOG_STASH_HOST" scope="context" source="logstash.host" defaultValue="127.0.0.1"/><!--輸出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><!--可以訪問的logstash日志收集端口--><destination>${LOG_STASH_HOST}:4560</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender><root level="info"><appender-ref ref="LOGSTASH"/>
</root>
- LOG_STASH_HOST 通過占位符可以使用 yml 配置,這樣方便后期動態調整。
四、應用測試
1. 啟動應用&檢測上報
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class);}/*** curl http://localhost:8091/api/ratelimiter/login?fingerprint=uljpplllll01009&uId=1000&token=8790*/@RequestMapping(value = "login", method = RequestMethod.GET)public String login(String fingerprint, String uId, String token) {log.info("模擬登錄 login fingerprint:{}", fingerprint);return "模擬登錄:登錄成功 " + uId;}}
- 地址:http://0.0.0.0:5601/app/dev_tools#/console(opens new window)
- 命令:GET _cat/indices - 通過命令檢測日志上報
2. 配置日志
地址:http://0.0.0.0:5601/app/discover(opens new window)
2.1 創建索引
- 當你的應用啟動后,會上報數據。這個時候在點擊 Discover 會提示你有可用的數據。
- 如圖創建索引即可。
2.2 回到監控
創建索引后,回到 Discover 即可查看監控日志。在這個階段,你可以訪問應用程序接口,查看上報日志信息;http://localhost:8091/api/ratelimiter/login?fingerprint=uljpplllll01009&uId=1000&token=8790(opens new window)
- 當你不斷的訪問接口,就可以看到上報的日志數據信息了。