搭建 ELK 實時日誌平台,並在 Spring Boot 和 Nginx 專案中使用

Mondo 科技 更新 2024-02-21

了解 ELK 實時日誌平台的工作原理,並練習如何構建和使用它。

在排查線上異常的過程中,查詢日誌始終是不可或缺的一部分。 如今,大多數微服務架構都使用,日誌分散在不同的機器上,這使得查詢日誌變得極其困難。 要想做好工作,首先要磨刀。如果這個時候有乙個統一的實時日誌分析平台,可以說是雪地裡的碳交割,這肯定會提高我們線上排查的效率。 本文將為您介紹開源實時日誌分析平台ELK的構建與使用。

ELK 是乙個開源的實時日誌分析平台,由Elasticsearch、Logstash和Kiabana三部分組成。

Logstash 主要用於收集伺服器日誌,是乙個具有實時流水線功能的開源資料收集引擎。 Logstash 動態統一來自不同資料來源的資料,並將資料規範化到您選擇的目標。

從 Logstash 收集資料的過程主要分為三個部分:

輸入:資料(包括但不限於日誌)通常以不同的形式和格式儲存在不同的系統中,LogStash 允許您從各種資料來源(檔案、系統日誌、mysql、訊息中介軟體等)收集資料。 過濾器:實時解析和轉換資料,識別命名字段以構建結構,並將其轉換為通用格式。 輸出:Elasticsearch 並不是儲存的唯一選項,Logstash 提供了許多輸出選項。 Elasticsearch (ES) 是乙個分布式的 RESTful 搜尋和資料分析引擎,具有以下特點:

查詢:允許您執行和組合多種型別的搜尋(結構化搜尋、非結構化搜尋、地理搜尋、指標搜尋),並更改搜尋方式。 分析:借助 Elasticsearch 聚合,您可以全面了解資料並探索趨勢和模式。 速度:非常快,可以實現上億級資料,毫秒級的回報。 可擴充套件性:在膝上型電腦或數百或數千台託管 PB 級資料的伺服器上執行。 彈性:在分布式環境中執行,在設計時考慮到了這一點。 靈活性:多種用例。 歡迎數字、文字、地理、結構化、非結構化,歡迎所有資料型別。 Kibana 使海量資料易於理解。 它很簡單,具有基於瀏覽器的介面,可讓您快速建立和共享動態資料儀表板,以跟蹤 Elasticsearch 中的實時資料變化。 此外,它也易於設定,因此您可以在幾分鐘內安裝 Kibana 並開始探索 Elasticsearch 的索引資料,而無需額外的基礎設施。

以上三個元件在《ELK協議棧介紹與架構》一文中都有詳細描述,這裡不再贅述。 在 ELK 中,三個元件的大致工作流程如下圖所示,Logstash 從每個服務收集日誌並將其儲存在 Elasticsearch 中,然後 Kiabana 從 Elasticsearch 查詢日誌並將其展示給終端使用者。

圖1ELK 的近似工作流程

通常我們的服務部署在不同的伺服器上,所以如何從多個伺服器收集日誌資訊是乙個關鍵點。 本文中提供的解決方案如下圖所示:

圖2本文提供了乙個 ELK 實現

如上圖所示,整個 ELK 執行如下:

在微服務(生成日誌的服務)上部署乙個 logstash,作為 shipper 角色,主要負責從機器上服務生成的日誌檔案中採集資料,並將訊息推送到 Redis 訊息佇列。 此外,伺服器還部署了 Indexer 角色的 Logstash 角色,主要負責從 Redis 訊息佇列中讀取資料,在 Logstash 流水線中對其進行解析和處理,然後輸出到 Elasticsearch 集群進行儲存。 Elasticsearch主備節點之間的資料同步。 在單台伺服器上部署 Kibana,從 Elasticsearch 讀取日誌資料並顯示在網頁上。 通過這張圖,我相信你對我們將要構建的 ELK 平台的工作流程以及所需的元件有乙個大致的了解。 讓我們一起開始構建它。

本節介紹如何使用 Indexer 角色構建 ELK 日誌平台,包括 Logstash、Elasticsearch 和 Kibana。 要完成此部分,您需要執行以下操作:

作為教程,Ubuntu 機器或虛擬機器省略了 Elasticsearch 集群的設定,而是在同一臺機器上安裝 Logstash(Indexer)、Elasticsearch 和 Kibana。 在 Ubuntu 上安裝 JDK,請注意 Logstash 要求 JDK 在 1對於 7 或更高版本,有關如何在 Ubuntu 上安裝 JDK 的詳細資訊,請參閱“在 Ubuntu 上安裝 JDK1”。8“ 這段文字。 Logstash、Elasticsearch、Kibana 安裝包,您可以在此頁面找到它們**。 解壓縮 zip 包:

tar -xzvf logstash-7.3.0.tar.gz
乙個簡單的用例測試轉到解壓縮目錄,並啟動乙個管道,將控制台輸入和輸出放入控制台。

cd logstash-7.3.0elk@elk:~/elk/logstash-7.3.0$ bin/logstash -e 'input }output }'
看到以下日誌表示 logstash 已成功啟動。

圖3logstash 啟動成功日誌。

在控制台中輸入hello logstash,以下效果表示 LogStash 安裝成功。

清單 1驗證 logstash 是否成功啟動

hello logstash
解壓安裝包:

tar -xzvf elasticsearch-7.3.0-linux-x86_64.tar.gz
啟動 Elasticsearch:

cd elasticsearch-7.3.0 bin elasticsearch 顯示更多顯示更多 icon在啟動 elasticsearch 的過程中,我遇到了兩個問題,這裡列出來是為了方便排查。 問題一:記憶體太小,如果你的機器記憶體小於Elasticsearch設定的值,就會報錯如下圖所示。 解決方法是修改 elasticsearch-73.0/config/jvm.選項檔案中的以下配置適合您機器的記憶體大小,如果修改後仍然報告此錯誤,您可以重新連線到伺服器並重試。 圖4記憶體太小,導致 Elasticsearch 啟動錯誤**!圖4記憶體太小,導致 Elasticsearch 啟動錯誤**!/ibm_articles_img/build-elk-and-use-it-for-springboot-and-nginx_images_image004.png)**問題 2** 如果以 root 使用者身份啟動,將報告如下圖所示的錯誤。解決方案當然是新增乙個新使用者來啟動 Elasticsearch,線上新增新使用者的方法有很多種,這裡就不贅述了。 圖5root 使用者在啟動 Elasticsearch 時出現錯誤**!圖5root 使用者在啟動 Elasticsearch 時出現錯誤**!/ibm_articles_img/build-elk-and-use-it-for-springboot-and-nginx_images_image005.png)
我在啟動 Elasticsearch 的過程中遇到了兩個問題,為了方便故障排除,我將在這裡列出它們。

問題一:如果機器記憶體小於Elasticsearch設定的值,則報錯如下圖所示。 解決方案是,修改elasticsearch-7.3.0/config/jvm.options檔案中的以下配置適合您機器的記憶體大小,如果修改後仍報此錯誤,可以重新連線到伺服器重試。

圖4記憶體太小,導致 Elasticsearch 啟動錯誤**!

問題二,如果您正在使用root如果使用者啟動它,它將報告如下圖所示的錯誤。 解決方案當然是新增乙個新使用者來啟動 Elasticsearch,線上新增新使用者的方法有很多種,這裡就不贅述了。

圖5root 使用者在啟動 Elasticsearch 時出現錯誤**!

啟動成功後,將設定另乙個會話視窗以執行curl http://localhost:9200命令,如果出現如下結果,則表示Elasticsearch安裝成功。

清單 2檢查Elasticsearch是否成功啟動

elk@elk:~$curl http://localhost:9200,"tagline" : "you know, for search"}
解壓安裝包:

tar -xzvf kibana-7.3.0-linux-x86_64.tar.gz
修改配置檔案config/kibana.yml,它指定了有關 Elasticsearch 的資訊。

清單 3Kibana 配置資訊

Elasticsearch主機位址:elasticsearchhosts: "http://ip:9200"允許遠端訪問伺服器host: "0.0.0.0"Elasticsearch 使用者名稱 這其實是我在伺服器上啟動 elasticsearch 時用的使用者名稱username: "es"Elasticsearch 認證密碼 這其實是我在伺服器上啟動 Elasticsearch 時用的密碼password: "es"
啟動 Kibana:

cd kibana-7.3.0-linux-x86_64/bin./kibana
在瀏覽器中訪問http://ip:5601如果出現以下螢幕,則表示Kibana安裝成功。

圖6Kibana 發布成功螢幕

ELK 日誌平台安裝完成後,我們將通過具體示例來了解如何使用 ELK,下面將介紹如何將 Spring Boot 日誌和 NGINX 日誌交給 ELK 進行分析。

首先我們需要建立乙個Spring Boot專案,我寫了一篇關於如何使用AOP統一處理Spring Boot web日誌的文章,本文中的Spring Boot專案就是基於這篇文章,原始碼可以在這裡獲取。 在專案中resources目錄spring-logback.xml配置 檔案。

清單 4Spring Boot 專案 logback 的配置

logback for demo mobile ..d [%thread] %5level %logger $ msg%n ..
上面省略了很多,你可以在原始碼中得到它。 在上面的配置中,我們定義了乙個名為rolling_fileappender以指定格式輸出日誌檔案。 以及以上pattern標籤是特定日誌格式的配置,通過上面的配置,我們指定了時間、執行緒、日誌級別、記錄器(通常是列印日誌的類的完整路徑)等資訊的輸出,以及服務的名稱。

打包專案並將其部署到 ubuntu 伺服器。

清單 5打包和部署 Spring Boot 專案

打包命令 mvn package -dm**entest.skip=true 部署命令 j**a -jar sb-elk-start-00.1-snapshot.jar
檢視日誌檔案logback在配置檔案中,我將日誌儲存在/log/sb-log.log檔案, 執行more /log/sb-log.log命令,則表示部署成功。

圖7Spring Boot 日誌檔案

Spring Boot 專案部署成功後,我們還需要在當前部署的機器上為shipper 角色安裝和配置 Logstash。 Logstash 的安裝過程已經在 ELK 平台設定部分進行了介紹,因此我不會在這裡詳細介紹。 安裝完成後,我們需要為 Logstash 編寫乙個配置檔案,以支援從日誌檔案中收集日誌並輸出到 Redis 訊息管道中,如 shipper 的配置所示。

清單 6為託運人角色配置 logstash

input }output }
其實 logstash 的配置對應上面提到的 logstash 流水線的三個部分(輸入、過濾、輸出),但是這裡我們不需要過濾,所以我們就不寫了。 上述配置中輸入使用的資料來源為檔案型別,只需配置需要採集的原生日誌檔案路徑即可。 輸出描述了如何匯出資料,在本例中,資料被配置為輸出到 REDIS。

Redis (英語)data_type可用值為channellist二。 channel是 Redis 的發布-訂閱通訊模式list是 Redis 的佇列資料結構,兩者都可用於實現系統之間訊息的有序非同步通訊。 channel比較list這樣做的好處是消除了發布者和訂閱者之間的耦合。 例如,在 Redis 中持續讀取記錄的索引器現在想要新增第二個索引器(如果使用)list,前一條記錄由第乙個索引器選取,下一條記錄由第二個索引器選取,從而在兩個索引器之間產生競爭,導致任何一方都不讀取完整日誌。 channel這是可以避免的。 這在 shipper 角色的配置檔案和下面將提到的索引器角色的配置檔案中都使用channel

配置完 Shipper 角色的 Logstash 後,我們還需要配置 Indexer 角色 Logstash,支援從 Redis 接收日誌資料,並通過篩選條件儲存在 Elasticsearch 中,如下圖所示。

清單 7索引器角色的日誌儲存配置

input }filter \=%ms|)"} }output elasticsearch }
與 Shipper 不同,我們在索引器管道中定義篩選器,這是將日誌解析為結構化資料的地方。 這是我擷取的一張截圖logback日誌內容:

清單 8Spring Boot 專案輸出的日誌

2019-08-11 18:01:31.602 [http-nio-8080-exec-2] info c.i.s.aop.WeblogaspAspect SB-ELK - 介面日誌 POST 請求測試介面結束呼叫:耗時 = 11ms,result=BaseResponse
在過濾器中,我們使用 grok 外掛程式從上述日誌中解析時間、執行緒名稱、記錄器、服務名稱和介面時間消耗字段。 grok 是如何工作的?

message欄位是儲存收集的資料的 logstash 字段match =這意味著將處理日誌內容。 Grok 實際上也通過正規表示式解析資料,如上所示timestamp_iso8601notspace等等都內建在 grok 中patterns,哪些是內建在 grok 中的patterns可以在這裡檢視。 我們可以使用 grok 偵錯程式來測試解析後的字串的正確性,避免了在真實環境中對解析規則正確性的重複驗證。 完成以上步驟後,我們已經完成了整個ELK平台的搭建和Spring Boot專案的整合。 讓我們按照以下步驟做一些事情,看看效果。

1. 啟動 Elasticsearch,啟動命令在 ELK 平台建設部分提到,這裡不再贅述(Kibana 啟動也是一樣)。 2. 以索引器角色啟動 Logstash。

進入 logstash 解壓目錄,執行如下命令:bin logstash -f indexer-logstashconf
3. 啟動 Kibana。

4. 為託運人角色啟動 Logstash。

進入logstash解壓目錄,執行以下命令:bin logstash -f shipper-logstashconf
5. 呼叫 Spring Boot 介面,此時資料應該已經寫入 ES。

6. 在瀏覽器中訪問http://ip:5601開啟 Kibana Web 介面,並新增它,如下圖所示logback指數。

圖8在 Kibana 中新增 Elasticsearch 索引

7. 輸入discover介面,選擇logbackindex,您可以看到日誌資料,如下圖所示。

圖9ELK 日誌檢視

相信大家已經通過以上步驟成功搭建了自己的ELK實時日誌平台,並連線了logback日誌。 但是,在實際場景中,幾乎不可能只有一種型別的日誌,所以讓我們在上述步驟的基礎上訪問 nginx 的日誌。 當然,這一步的前提是我們需要在伺服器上安裝 nginx,具體安裝過程在網路上有描述,這裡就不贅述了。 檢視nginx的日誌如下(nginx的訪問日誌預設開啟。/var/log/nginx/access.log檔案)。

清單 9nginx 的訪問日誌

192.168.142.1 - 17/aug/2019:21:31:43 +0800] "get /weblog/get-test?name=elk http/1.1"200 3 "" "mozilla/5.0 (windows nt 10.0; win64; x64)applewebkit/537.36 (khtml, like gecko) chrome/76.0.3809.100 safari/537.36"
同樣,我們需要為此日誌編寫乙個 grok 解析規則,如下所示:

清單 10Grok nginx 訪問日誌的解析規則

% \"% %http/%" % "%" "%"
畢竟,關鍵點是索引器型別的 logstash 需要支援兩種型別的輸入、篩選器和輸出,但如何支援呢? 首先需要指定輸入型別,然後根據不同的輸入型別經過不同的過濾器和輸出,如下圖所示(由於篇幅原因,這裡沒有顯示配置檔案,可以在這裡獲取)。 清單 11索引器角色的 logstash 配置支援兩種型別的日誌輸入

input redis }filter if [type] == "nginx" }output if [type] == "nginx" }
我的 nginx 和 Spring Boot 專案部署在同一臺機器上,所以我需要修改 shipper 型別的 logstash 的配置,以支援兩種型別的日誌輸入和輸出,配置檔案的內容可以在這裡獲取。 完成以上配置後,我們可以按照 View Effect 章節中的步驟啟動 Shipper 角色的 ELK 平台、Logstash、Nginx 和 Spring Boot 專案,然後在 Kibana 上新增 Nignx 索引,同時檢視 Spring Boot 和 Nginx 日誌,如下圖所示。 圖10Elk 檢視 Nginx 日誌

在以上步驟中,ELK 的啟動過程是將三個元件的啟動命令一一執行。 而且也是在前台啟動的,這意味著如果我們關閉會話視窗,元件就會停止,導致整個 ELK 平台無法使用,這在實踐中是不現實的,剩下的就是如何讓 ELK 在後台執行。 正如《Logstash 最佳實踐》一書中所建議的那樣,我們將使用主管來管理 ELK 的啟動和停止。 首先,我們需要安裝 supervisor 並在 ubuntu 上執行它apt-get install supervisor能。 安裝成功後,我們還需要在 supervisor 的配置檔案中配置 ELK 的三個元件(其配置檔案預設/etc/supervisor/supervisord.conf檔案)。清單 12麋鹿在後台啟動

[program:elasticsearch]environment=j**a_home="/usr/j**a/jdk1.8.0_221/"directory=/home/elk/elk/elasticsearchuser=elkcommand=/home/elk/elk/elasticsearch/bin/elasticsearch[program:logstash]environment=j**a_home="/usr/j**a/jdk1.8.0_221/"directory=/home/elk/elk/logstashuser=elkcommand=/home/elk/elk/logstash/bin/logstash -f /home/elk/elk/logstash/indexer-logstash.conf[program:kibana]environment=ls_heap_size=5000mdirectory=/home/elk/elk/kibanauser=elkcommand=/home/elk/elk/kibana/bin/kibana
上述配置完成後,執行以下引數sudo supervisorctl reload整個 ELK 啟動已完成,預設情況下會自動啟動。 當然,我們也可以使用它sudo supervisorctl start/stop [program_name]以管理單個應用。

在本教程中,我們主要了解什麼是ELK,然後通過實際操作與您一起構建ELK日誌分析平台,並訪問logback和nginx日誌。 您可以在 GitHub 上找到原始碼 ** 和 logstash 配置檔案。

相關問題答案

    俄羅斯展覽建設中的環境概念和實踐 綠色展覽的未來

    隨著全球環保意識的不斷增強,綠色會展已成為未來會展行業的發展趨勢。在俄羅斯,會展業也開始積極踐行環保理念,致力於推動綠色會展的發展。本文將深入探討俄羅斯展會建設中環保的理念和實踐,以及綠色展會的未來前景。一是環保理念的普及和實踐。回收利用 俄羅斯展覽會建築業高度重視回收利用,鼓勵參展商和參觀者使用可...

    如何搭建3D人體虛擬解剖學培訓教室?這四個方面應該被考慮在內

    在當今的教育體系中,特別是在醫學教育領域,引入虛擬解剖學培訓教室被視為一種創新和進步。它不僅提供了一種更安全 更有效的學習方式,而且還增強了學生的學習體驗。本文旨在提高虛擬解剖教室的優勢,提高教學質量,提高資源利用率,以及高校在建設虛擬解剖學培訓教室時應注意的重點。虛擬解剖學教室利用先進的計算機模擬...

    如何搭建戶外舞台

    室外舞台搭建是一項複雜的任務,既需要舞台的功能和美觀,又需要施工過程的安全性。在這篇文章中,我將深入分析戶外舞台搭建的步驟和關鍵點,並推導出一些相關內容,使文章更加豐富。.確定載物台的大小和形狀根據活動的需要和場地的大小,確定舞台的大小和形狀。常見的舞台形狀有長方形 圓形 不規則形狀等。.選擇合適的...

    舞台搭建 大型舞台搭建公司

    舞台搭建是大型演出的重要環節之一,它們為演出提供了極具創意和震撼力的舞台背景,給觀眾帶來了新的視覺享受。大型舞台搭建公司是一家專門從事舞台搭建的機構,為演出提供創造性 實用性 安全的舞台搭建解決方案。大型舞台搭建公司擁有豐富的經驗和專業知識。他們的團隊由資深設計師 工程師和技術人員組成,具有紮實的舞...

    搭建舞台報價,專業搭建舞台服務,價格實惠!

    舞台是任何活動不可或缺的一部分。無論是表演 會議 慶祝活動還是其他形式的活動,您都需要乙個表演平台來展示精彩的表演和內容。因此,搭建舞台成為一項必要的工作。然而,分期並不是一項簡單的任務,它需要專業知識和大量經驗。為了保證舞台搭建的質量和效果,選擇專業的舞台搭建服務商是很重要的。在選擇舞台搭建服務提...