Spring Boot/Spring Cloud 整合 ELK(Elasticsearch、Logstash、Kibana)詳細避坑指南

我們在開發中經常會寫日志,所以需要有個日志可視化界面管理,使用ELK可以實現高效集中化的日志管理與分析,提升性能穩定性,滿足安全合規要求,支持開發運維工作。

下述是我在搭建ELK時遇到的許許多多的坑,希望能替大家避開.

1. 環境準備

  • Elasticsearch: 用于存儲和檢索日志數據。

  • Logstash: 用于收集、處理和轉發日志數據。

  • Kibana: 用于可視化和分析日志數據。

2. 安裝 ELK 組件

你可以通過 Docker 快速安裝 ELK 組件:

# 拉取 ELK 鏡像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.0
docker pull docker.elastic.co/logstash/logstash:7.10.0
docker pull docker.elastic.co/kibana/kibana:7.10.0# 啟動 Elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.10.0# 啟動 Logstash
docker run -d --name logstash -p 5044:5044 docker.elastic.co/logstash/logstash:7.10.0# 啟動 Kibana
docker run -d --name kibana -p 5601:5601 --link elasticsearch:elasticsearch docker.elastic.co/kibana/kibana:7.10.0

若不通過Docker,可直接官網下載,如下:

2.1 下載Elasticsearch

? ? ? ?-?訪問?Elasticsearch 下載頁面,選擇適合的版本(如 8.17.3)。

? ? ? ? - 解壓下載的文件

? ? ? ? - 啟動 Elasticsearch:

????????????????默認情況下,Elasticsearch 會監聽?9200?端口。

????????????????訪問?http://localhost:9200,確認 Elasticsearch 是否正常運行。

? ? ? ?

????????避坑點1:

? ? ? ?在啟動時,發現老是報錯,查了很久都沒有結果,最終終于排查出來是環境變量配置的問題.

? ? ? ? 我們可以看下述它自帶的配置文件,文件中說明了若配置了ES_JAVA_HOME,則會使用此配置指向的JDK,但是此處JAVA_HOME和CLASS_PATH的環境變量會影響啟動,所以如果想要直接使用它自帶的JDK,需要將JAVA_HOME和CLASS_PATH的環境變量暫時注釋掉.

set SCRIPT=%0rem determine Elasticsearch home; to do this, we strip from the path until we
rem find bin, and then strip bin (there is an assumption here that there is no
rem nested directory under bin also named bin)
for %%I in (%SCRIPT%) do set ES_HOME=%%~dpI:es_home_loop
for %%I in ("%ES_HOME:~1,-1%") do set DIRNAME=%%~nxI
if not "%DIRNAME%" == "bin" (for %%I in ("%ES_HOME%..") do set ES_HOME=%%~dpfIgoto es_home_loop
)
for %%I in ("%ES_HOME%..") do set ES_HOME=%%~dpfIrem now set the classpath
set ES_CLASSPATH=!ES_HOME!\lib\*
set ES_MODULEPATH=!ES_HOME!\lib
set LAUNCHERS_CLASSPATH=!ES_CLASSPATH!;!ES_HOME!\lib\launchers\*;!ES_HOME!\lib\java-version-checker\*
set SERVER_CLI_CLASSPATH=!ES_CLASSPATH!;!ES_HOME!\lib\tools\server-cli\*set HOSTNAME=%COMPUTERNAME%if not defined ES_PATH_CONF (set ES_PATH_CONF=!ES_HOME!\config
)rem now make ES_PATH_CONF absolute
for %%I in ("%ES_PATH_CONF%..") do set ES_PATH_CONF=%%~dpfIset ES_DISTRIBUTION_TYPE=zipcd /d "%ES_HOME%"rem now set the path to java, pass "nojava" arg to skip setting ES_JAVA_HOME and JAVA
if "%1" == "nojava" (exit /b
)rem comparing to empty string makes this equivalent to bash -v check on env var
rem and allows to effectively force use of the bundled jdk when launching ES
rem by setting ES_JAVA_HOME=
if defined ES_JAVA_HOME (set JAVA="%ES_JAVA_HOME%\bin\java.exe"set JAVA_TYPE=ES_JAVA_HOMEif not exist !JAVA! (echo "could not find java in !JAVA_TYPE! at !JAVA!" >&2exit /b 1)rem check the user supplied jdk version!JAVA! -cp "%ES_HOME%\lib\java-version-checker\*" "org.elasticsearch.tools.java_version_checker.JavaVersionChecker" || exit /b 1
) else (rem use the bundled JDK (default)set JAVA="%ES_HOME%\jdk\bin\java.exe"set "ES_JAVA_HOME=%ES_HOME%\jdk"set JAVA_TYPE=bundled JDK
)rem do not let JAVA_TOOL_OPTIONS slip in (as the JVM does by default)
if defined JAVA_TOOL_OPTIONS (echo warning: ignoring JAVA_TOOL_OPTIONS=%JAVA_TOOL_OPTIONS%set JAVA_TOOL_OPTIONS=
)rem warn that we are not observing the value of $JAVA_HOME
if defined JAVA_HOME (echo warning: ignoring JAVA_HOME=%JAVA_HOME%; using %JAVA_TYPE% >&2
)rem JAVA_OPTS is not a built-in JVM mechanism but some people think it is so we
rem warn them that we are not observing the value of %JAVA_OPTS%
if defined JAVA_OPTS ((echo|set /p=warning: ignoring JAVA_OPTS=%JAVA_OPTS%; )echo pass JVM parameters via ES_JAVA_OPTS
)cd %ES_HOME%

成功啟動后,訪問地址效果:

2.2 安裝 Logstash

  1. 下載 Logstash:
    • 訪問?Logstash 下載頁面,選擇適合的版本(如 8.17.3)。

    • 解壓下載的文件

??使用?-e?參數進行簡單測試

bin/logstash -e 'input { stdin {} } output { stdout { codec => rubydebug } }'

若啟動成功,可訪問http://localhost:9600/看是否有json數據返回即可.

到此處,說明下載的Logstash沒問題.

????????

????????2.?配置文件編寫

????????Logstash 的配置文件分為兩類:主配置文件(logstash.conf)和管道配置文件(pipelines.yml)。

????????

????????1)logstash.conf?配置文件

logstash.conf 是 Logstash 的核心配置文件,定義了數據的輸入、過濾和輸出。它通常位于 Logstash 安裝目錄的 config 文件夾中。

  • 輸入(Input):定義數據源,例如日志文件、網絡端口等。
    示例:

    input {file {path => "/var/log/*.log"start_position => "beginning"}
    }
  • 過濾(Filter):對數據進行解析和處理,例如使用 Grok 插件解析日志。
    示例:

    filter {grok {match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request}" }}
    }
  • 輸出(Output):定義數據的輸出目標,例如 Elasticsearch、文件或控制臺。
    示例:

  • output {elasticsearch {hosts => ["http://localhost:9200"]index => "logstash-%{+YYYY.MM.dd}"}stdout {codec => rubydebug}
    }

????????(2)pipelines.yml?配置文件

pipelines.yml 文件用于定義管道的配置,包括管道的名稱和配置文件路徑。它通常位于 Logstash 安裝目錄的 config 文件夾中。

- pipeline.id: mainpath.config: "config/logstash-sample.conf"

避坑點2:

此處不知道怎么配置都會顯示 No configuration found in the configured sources. 一直沒找出原因

重新從配置的信息中找原因,最終發現是conf配置文件的問題.

logstash-sample.conf? 示例如下:

input {# 示例3:HTTP 接收數據http {port => 8080codec => "json"}
}output {# 示例1:輸出到 Elasticsearch(帶安全認證)elasticsearch {hosts => ["http://localhost:9200"]index => "logs-%{+YYYY.MM.dd}"user => "elastic"password => "password"ssl => false}
}

?logstash.yml? 此文件需要配置上去,否則會一直報錯,很多教程中沒有指這一點!!!


# 節點名稱(用于集群標識)
node.name: "my-logstash-node"# 管道配置路徑(可指定多個管道)
path.config: "config/pipelines/*.conf"# 數據存儲路徑(隊列和持久化數據)
path.data: "data/"# 日志路徑
path.logs: "logs/"# HTTP API 配置(用于監控和管理)
api.http.host: "0.0.0.0"
api.http.port: 9600# 性能調優(根據硬件調整線程和批處理大小)
pipeline.workers: 2          # 工作線程數(建議等于CPU核心數)
pipeline.batch.size: 125     # 每批處理事件數

上述坑點避開后,基本上都能啟動了。效果如下:

2.3 安裝 Kibana

  1. 下載 Kibana:

    • 訪問?Kibana 下載頁面,選擇適合的版本(如 8.17.3)。

    • 解壓下載的文件

  2. 配置 Kibana:
    編輯?config/kibana.yml?文件,設置 Elasticsearch 的地址:

    elasticsearch.hosts: ["http://localhost:9200"]
    server.host: "0.0.0.0"
  3. 啟動 Kibana:

    ./bin/kibana
    • Kibana 會監聽?5601?端口。

    • 訪問?http://localhost:5601,確認 Kibana 是否正常運行。

首次啟動時,報了下述錯誤:

?從日志上看起來應該是配置問題,依舊先檢查配置文件?config/kibana.yml

原來是按上述的配置文件內容是不足夠的,所以我又添加了一些配置信息(Elastic連接信息、Kibana安全參數等)

# 配置Kibana服務運行的主機地址,允許遠程訪問時可設置為"0.0.0.0"
server.host: "localhost"# 配置Kibana服務運行的端口
server.port: 5601# 配置Elasticsearch的地址,如果有多個節點,可以像下面這樣列出
elasticsearch.hosts:- "http://localhost:9200"# 啟用Kibana的安全功能
xpack.security.enabled: true# 配置Elasticsearch的用戶名和密碼
elasticsearch.username: "elastic"
elasticsearch.password: "your_password"

按上述配置文件重啟后,依舊報錯:

原因:kibana連接Elasticsearch不允許直接使用超級賬號elastics,需要按照下述方式創建專用賬號

使用elasticsearch-service-tokens?CLI工具
  1. 打開終端或命令提示符。

  2. 運行以下命令來創建服務賬號令牌:

    bash復制

    elasticsearch-service-tokens create elastic/kibana <token_name>

    其中elastic/kibana是Kibana的服務賬號,<token_name>是你為這個令牌指定的名稱,例如kibana-token

  3. 該命令會在$ES_HOME/config/service_tokens文件中保存新的服務令牌,并在終端輸出Bearer令牌。

# 配置Kibana服務運行的主機地址,允許遠程訪問時可設置為"0.0.0.0"
server.host: "localhost"# 配置Kibana服務運行的端口
server.port: 5601# 配置Elasticsearch的地址,如果有多個節點,可以像下面這樣列出
elasticsearch.hosts:- "http://localhost:9200"elasticsearch.serviceAccountToken: "AAEAAWVsYXN0aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1NldHZlZjdm9B"

根據生成的TOKEN,按上述最終的配置信息,重啟服務即可,訪問localhost:5601,出現下述界面說明成功了!

3. 集成項目

上述三個服務全部安裝完成之后,我們就可以開始對接項目了.

Spring Boot 項目配置

3.1 添加依賴

在?pom.xml?中添加依賴:

<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.6</version>
</dependency>
3.2 添加配置

在?src/main/resources?目錄下創建?logback-spring.xml?文件(此處需注意,若已存在logback相關xml文件,則不需要重新創建):

<?xml version="1.0" encoding="UTF-8"?>
<configuration><include resource="org/springframework/boot/logging/logback/base.xml"/><appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>localhost:5044</destination><encoder class="net.logstash.logback.encoder.LogstashEncoder"/></appender><root level="INFO"><appender-ref ref="LOGSTASH"/><appender-ref ref="console"/></root>
</configuration>

添加上述配置,注意root節點不能重復,重復的話會以最后一個root節點為主.

3.3?測試:

在你的項目中將日志打印出來

logger.info("用戶列表日志記錄!!!");

若上述有問題,則需要檢查是否已經創建了索引,先檢查logstash的配置文件:

input {tcp {port => 5044codec => json_lines}
}output {# 示例1:輸出到 Elasticsearch(帶安全認證)elasticsearch {hosts => ["http://localhost:9200"]index => "springboot-logs-%{+YYYY.MM.dd}"user => "elastic"password => "XXX"ssl => false}
}

此處的tcp監聽是監聽springboot配置文件中對應的端口.

3.4?查看索引

output中的index則是elastic的索引名稱,訪問此路徑確認索引是否創建成功:http://localhost:9200/_cat/indices?v

若創建成功,在下圖中就能看到了

3.5?查看日志

有了索引,我們就可以在kibana中查看了,如下圖:

Stack Management? ->?Data views -> Create data view

Discover 中搜索并查看,如下圖:

這樣我們整個過程就結束了,也成功使用ELK查看到日志了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73001.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI編程: 一個案例對比CPU和GPU在深度學習方面的性能差異

背景 字節跳動正式發布中國首個AI原生集成開發環境工具&#xff08;AI IDE&#xff09;——AI編程工具Trae國內版。 該工具模型搭載doubao-1.5-pro&#xff0c;支持切換滿血版DeepSeek R1&V3&#xff0c; 可以幫助各階段開發者與AI流暢協作&#xff0c;更快、更高質量地完…

手機屏幕摔不顯示了,如何用其他屏幕臨時顯示,用來導出資料或者清理手機

首先準備一個拓展塢 然后 插入一個外接的U盤 插入鼠標 插入有數字小鍵盤區的鍵盤 然后準備一根高清線&#xff0c;一端鏈接電腦顯示器,一端插入拓展塢 把拓展塢的連接線&#xff0c;插入手機充電口&#xff08;可能會需要轉接頭&#xff09; 然后確保手機開機 按下鍵盤…

探索鏈表的奧秘:C語言中的查找操作與鏈表打印

目錄 鏈表的基本結構 頭插法 打印鏈表 按位置查找 按值查找 主函數 查找操作 示例運行 輸出示例 總結 在數據結構的學習中&#xff0c;鏈表是一種非常重要的線性結構。它的動態特性使得在插入和刪除操作時比數組更為高效。今天&#xff0c;我們將繼續探討鏈表的操作&…

第八屆藍橋杯單片機省賽

什么&#xff1f;你把最近幾屆省賽真題做完已經無題可做了&#xff0c;那不妨來看看老古董第八屆省賽的題目吧&#xff01; 附件&#xff1a;第八屆藍橋杯單片機省賽 一、數碼管 1.頁面流轉 以上的頁面流轉功能可以用下圖總結&#xff1a; #mermaid-svg-38fdQpdydbMy5CyP {fo…

win10電腦鼠標速度突然變的很慢?

電腦鼠標突然變很慢&#xff0c;殺毒檢測后沒問題&#xff0c;鼠標設置也沒變&#xff0c;最后發現可能是誤觸鼠標的“DPI”調節鍵。 DPI調節鍵在鼠標滾輪下方&#xff0c;再次點擊即可恢復正常鼠標速度。 如果有和-的按鍵&#xff0c;速度變快&#xff0c;-速度變慢。 圖源&…

1-002:MySQL InnoDB引擎中的聚簇索引和非聚簇索引有什么區別?

在 MySQL InnoDB 存儲引擎 中&#xff0c;索引主要分為 聚簇索引&#xff08;Clustered Index&#xff09; 和 非聚簇索引&#xff08;Secondary Index&#xff09;。它們的主要區別如下&#xff1a; 1. 聚簇索引&#xff08;Clustered Index&#xff09; 定義 聚簇索引是表數…

【解決哈希沖突】

哈希沖突 如果兩個不同的 key 通過哈希函數得到了相同的索引&#xff0c;這種情況就叫做「哈希沖突」。 哈希沖突不可能避免&#xff0c;只能在算法層面妥善處理出現哈希沖突的情況。 哈希沖突是一定會出現的&#xff0c;因為這個 hash 函數相當于是把一個無窮大的空間映射到…

文件操作詳解(萬字長文)

C語言文件操作 一、為什么使用文件&#xff1f;二、文件分類三、文件的打開和關閉四、文件的順序讀寫4.1fputc4.2fgetc4.3fputs4.4fgets4.5 fprintf4.6 fscanf4.7 fwrite4.8 fread 五、文件的隨機讀寫5.1 fseek5.2 ftell和rewind六、文件讀取結束的判定七、文件緩沖區 一、為什…

基于 JDBC 的后端與 MySQL 數據庫交互 javaweb

一、了解JDBC 二、添加MySQL的JDBC驅動包 三、使用JDBC連接數據庫應用&#x1f517; 3.1創建一個包 3.2 查找實例 3.3 修改添加刪除實例 四、封裝 &#x1f4e6; DBConnection.java MysqlUtil.java 測試使用一下 測試1 測試2 在后端開發中&#xff0c;與數據庫進行交…

貪心算法--

1.檸檬水找零 link:860. 檸檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 貪心算法&#xff0c; 優先花出大面額bill&#xff0c; 盡可能保護小面額billint five 0, ten 0;// 不…

基于YOLO11深度學習的電瓶車進電梯檢測與語音提示系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

github生成badges的方法

在Github頁面上生成類似下面這樣的badge的方法 你可以通過以下步驟在GitHub個人主頁的README中創建類似的技術棧徽章&#xff1a; 一、使用 Shields.io 生成徽章 Shields.io 是一個開源徽章生成工具&#xff0c;支持自定義文本、顏色、圖標等參數。 1. 基礎模板 https://…

vue3 二次封裝uni-ui中的組件,并且組件中有 v-model 的解決方法

在使用uniappvue3開發中&#xff0c; 使用了uni-ui的組件&#xff0c;但是我們也需要自定義組件&#xff0c;比如我要自定一個picker 的組件&#xff0c; 是在 uni-data-picker 組件的基礎上進行封裝的 父組件中的代碼 <classesselect :selectclass"selectclass"…

Spring Boot啟動流程及源碼實現深度解析

Spring Boot啟動流程及源碼實現深度解析 一、啟動流程概述 Spring Boot的啟動流程圍繞SpringApplication類展開&#xff0c;核心流程可分為以下幾個階段&#xff1a; 初始化階段&#xff1a;推斷應用類型&#xff0c;加載ApplicationContextInitializer和ApplicationListene…

爬蟲案例七Python協程爬取視頻

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、Python協程爬取視頻 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 爬蟲案例七協程爬取視頻 提示&#xff1a;以下是本篇文章正文…

uni-app開發的App和H5嵌套封裝的App,以及原生App有什么區別

uni-app 開發的 App 和 H5 嵌套封裝的 App 是兩種不同的開發模式&#xff0c;雖然它們都可以實現跨平臺開發&#xff0c;但在技術實現、性能、功能支持等方面有顯著區別。以下是詳細對比&#xff1a; 1. uni-app 開發的 App uni-app 是一個基于 Vue.js 的跨平臺開發框架&#…

Python 爬蟲實戰案例 - 獲取拉勾網招聘職位信息

引言 拉勾網&#xff0c;作為互聯網招聘領域的佼佼者&#xff0c;匯聚了海量且多樣的職位招聘信息。這些信息涵蓋了從新興科技領域到傳統行業轉型所需的各類崗位&#xff0c;無論是初出茅廬的應屆生&#xff0c;還是經驗豐富的職場老手&#xff0c;都能在其中探尋到機遇。 對…

LM Studio 替換源的方式解決huggingface.co無法訪問的問題

安裝軟件完成之后&#xff0c;不要打開&#xff0c;打開了就直接關閉 在安裝目錄下&#xff0c;比如我安裝在E:\Program Files\LM Studio 下面三個文件中的huggingface.co全部替換為hf-mirror.com然后再打開即可。 E:\Program Files\LM Studio\resources\app\.webpack\rende…

【模擬CMOS集成電路設計】帶隙基準(Bandgap)設計與仿真(基于運放的電流模BGR)

【模擬CMOS集成電路設計】帶隙基準&#xff08;Bandgap&#xff09;設計與仿真 前言工程文件&部分參數計算過程&#xff0c;私聊~ 一、 設計指標指標分析&#xff1a; 二、 電路分析三、 仿真3.1仿真電路圖3.2仿真結果(1)運放增益(2)基準溫度系數仿真(3)瞬態啟動仿真(4)靜態…

微服務拆分-遠程調用

我們在查詢購物車列表的時候&#xff0c;它有一個需求&#xff0c;就是不僅僅要查出購物車當中的這些商品信息&#xff0c;同時還要去查到購物車當中這些商品的最新的價格和狀態信息&#xff0c;跟購物車當中的快照進行一個對比&#xff0c;從而去提醒用戶。 現在我們已經做了服…