還在用命令列看日誌?快用Kibana吧,視覺化日誌分析YYDS!

語言: CN / TW / HK

最近我把mall專案升級支援了SpringBoot 2.7.0,同時升級了整套ELK日誌收集系統。我發現每次升級Kibana介面都會有一定的改變,變得更現代化了吧!今天來聊聊mall專案的日誌收集機制,使用了SpringBoot支援的最新版ELK,希望對大家有所幫助!

SpringBoot實戰電商專案mall(50k+star)地址:http://github.com/macrozheng/mall

ELK日誌收集系統搭建

首先我們需要搭建ELK日誌收集系統,這裡使用在Docker環境下安裝的方式。

  • 安裝並執行Elasticsearch容器,使用如下命令即可;

bash docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \ -e "discovery.type=single-node" \ -e "cluster.name=elasticsearch" \ -e "ES_JAVA_OPTS=-Xms512m -Xmx1024m" \ -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \ -d elasticsearch:7.17.3

  • 啟動時會發現/usr/share/elasticsearch/data目錄沒有訪問許可權,只需要修改/mydata/elasticsearch/data目錄的許可權,再重新啟動即可;

bash chmod 777 /mydata/elasticsearch/data/

  • 安裝並執行Logstash容器,使用如下命令即可,logstash.conf檔案地址:http://github.com/macrozheng/mall/blob/master/document/elk/logstash.conf

bash docker run --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 \ --link elasticsearch:es \ -v /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \ -d logstash:7.17.3

  • 進入容器內部,安裝json_lines外掛;

bash docker exec -it logstash /bin/bash logstash-plugin install logstash-codec-json_lines

  • 安裝並執行Kibana容器,使用如下命令即可;

bash docker run --name kibana -p 5601:5601 \ --link elasticsearch:es \ -e "elasticsearch.hosts=http://es:9200" \ -d kibana:7.17.3

  • ELK日誌收集系統啟動完成後,就可以訪問Kibana的介面了,訪問地址:http://192.168.3.105:5601

日誌收集原理

日誌收集系統的原理是這樣的,首先應用集成了Logstash外掛,通過TCP向Logstash傳輸日誌。Logstash接收到日誌後根據日誌型別將日誌儲存到Elasticsearch的不同索引上去,Kibana從Elasticsearch中讀取日誌,然後我們就可以在Kibana中進行視覺化日誌分析了,具體流程圖如下。

這裡把日誌分成了如下四種類型,方便檢視:

  • 除錯日誌(mall-debug):所有的DEBUG級別以上日誌;
  • 錯誤日誌(mall-error):所有的ERROR級別日誌;
  • 業務日誌(mall-business):com.macro.mall包下的所有DEBUG級別以上日誌;
  • 記錄日誌(mall-record):com.macro.mall.tiny.component.WebLogAspect類下所有DEBUG級別以上日誌,該類是統計介面訪問資訊的AOP切面類。

啟動應用

首先得把mall專案的三個應用啟動起來,通過--link logstash:logstash連線到Logstash。

mall-admin

bash docker run -p 8080:8080 --name mall-admin \ --link mysql:db \ --link redis:redis \ --link logstash:logstash \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/admin/logs:/var/logs \ -d mall/mall-admin:1.0-SNAPSHOT

mall-portal

bash docker run -p 8085:8085 --name mall-portal \ --link mysql:db \ --link redis:redis \ --link mongo:mongo \ --link rabbitmq:rabbit \ --link logstash:logstash \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/portal/logs:/var/logs \ -d mall/mall-portal:1.0-SNAPSHOT

mall-search

bash docker run -p 8081:8081 --name mall-search \ --link elasticsearch:es \ --link mysql:db \ --link logstash:logstash \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/search/logs:/var/logs \ -d mall/mall-search:1.0-SNAPSHOT

其他元件

其他元件如MySQL和Redis的部署不再贅述,想部署全套的小夥伴可以參考部署文件。

http://www.macrozheng.com/mall/deploy/mall_deploy_docker.html

視覺化日誌分析

接下來我們體驗下Kibana的視覺化日誌分析功能,以mall專案為例,確實很強大!

建立索引匹配模式

  • 首先我們需要開啟Kibana的Stack管理功能;

  • 為Kibana建立索引匹配模式

  • 大家可以看到我們之前建立的四種日誌分類已經在ES中建立了索引,字尾為產生索引的日期;

  • 我們需要通過表示式來匹配對應的索引,先建立mall-debug的索引匹配模式;

  • 然後再建立mall-errormall-businessmall-record的索引匹配模式;

  • 接下來開啟分析中的發現功能,就可以看到應用中產生的日誌資訊了。

日誌分析

  • 我們先來聊聊mall-debug日誌,這類日誌是最全的日誌,可用於測試環境除錯使用,當我們有多個服務同時產生日誌時,我們可以通過過濾器來過濾出對應服務的日誌;

  • 當然你也可以使用Kibana的專用查詢語句KQL來過濾;

  • 還可以實現模糊查詢,比如查詢下message中包含分頁的日誌,查詢速度確實很快;

  • 通過mall-error日誌可以快速獲取應用的報錯資訊,準確定位問題,例如把Redis服務給停了,這裡就輸出了日誌;

  • 通過mall-business日誌可以檢視com.macro.mall包下的所有DEBUG級別以上日誌,通過這個日誌我們可以方便地檢視呼叫介面時輸出的SQL語句;

  • 通過mall-record日誌可以方便地檢視介面請求情況,包括請求路徑、引數、返回結果和耗時等資訊,哪個介面訪問慢一目瞭然;

總結

今天給大家分享了下mall專案中的日誌收集解決方案以及如何通過Kibana來進行日誌分析,對比直接去伺服器上用命令列看日誌,確實方便多了。而且Kibana還可以對不同服務產生的日誌進行聚合,同時支援全文搜尋,確實功能很強大。

參考資料

關於如何自定義SpringBoot中的日誌收集機制可以參考下你居然還去伺服器上撈日誌,搭個日誌收集系統難道不香麼!

如果你需要對日誌進行安全保護的話可以參考下居然有人想白嫖我的日誌,趕緊開啟安全保護壓壓驚!

專案原始碼地址

http://github.com/macrozheng/mall

「其他文章」