後端——》springboot整合elk日誌框架(elasticsearch+logstash+kibana)

語言: CN / TW / HK

簡介

elk日誌框架是elasticsearch、logstash、kibana的這三個技術的簡稱。elasticsearch是一個搜尋引擎,logstash是日誌管理平臺,kibana是elasticsearch的gui。elk日誌框架就是將日誌按照我們的要求顯示在網頁上,並且可以進行聚合查詢、篩選分析。不用再登入伺服器grep匹配,也不用在日誌檔案中慢慢的挑error。先看效果圖:

如下為:日誌的定位 這是日誌的顯示 如下為:日誌的分析 日誌的分析

安裝

這三個程式可以官網下載(需要_微_皮_嗯),為了方便我這裡已經打包好了,可直接下載, 連結: https://download.csdn.net/download/nienianzhi1744/13192854

解壓後文件夾如下:

解壓目錄

elasticsearch的安裝

1,【配置檔案修改】:修改elasticsearch-6.8.1/config目錄下的elasticsearch.yml檔案,新增如下配置:

```java

允許跨域請求

http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization,Content-Type

開啟安全校驗

xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.authc.accept_default_password: true ```

如下圖: elasticsearch.yml 2,【設定登入密碼】:cmd命令進入到elasticsearch-6.8.1/bin目錄,輸入如下命令,設定登入密碼:

java elasticsearch-setup-passwords auto 回車後按y執行完,會自動設定密碼,如下圖: 設定elasticsearch密碼 將使用者名稱和密碼複製貼上記錄一下,以後會用到。 (此處有一個坑:windows下輸入自動設定密碼的命令不會報錯,但輸入手動設定密碼的命令elasticsearch-setup-passwords interactive就會報錯:Connection failure to: http://127.0.0.1:9200/_xpack/security/_authenticate?pretty failed: Connection refused: connect。以後有空再來研究為什麼)

3,【安裝elasticsearch分詞器】:上一步的命令執行結束後,不要關閉視窗,繼續在bin目錄下執行命令安裝分詞器,這一步耗時稍長,中途會自動輸出命令確認是否繼續,我們按y繼續,安裝完成後視窗會自動變成可輸入狀態:

java elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.1/elasticsearch-analysis-ik-6.8.1.zip (這裡必須要安裝,否則後續整合的時候會報錯:analyzer [xxx] not found for field [xxx]])

4,【啟動elasticsearch】:雙擊elasticsearch.bat啟動elasticsearch。如下圖: 啟動elasticsearch 啟動後彈出來elasticsearch的命令窗,不要關閉,如下圖: elasticsearch命令窗 5:【瀏覽器訪問elasticsearch】:此時在瀏覽器中輸入:http://localhost:9200/
在彈窗中輸入第2步自動設定的使用者名稱和密碼: 使用者名稱:elastic 密碼:xxx 出來下圖介面表示elasticsearch啟動成功,這個localhost:9200 網頁可以關掉了,暫時用不上它了。 elasticsearch啟動成功

kibana的安裝

1,【配置檔案修改】:修改kibana-6.8.1-windows-x86_64\config目錄下的kibana.yml檔案,新增如下配置:

```java

中文漢化

i18n.locale: "zh-CN" server.host: "0.0.0.0"

ES的訪問埠號

elasticsearch.url: "http://localhost:9200"

ES的使用者名稱和密碼

elasticsearch.username: "elastic" elasticsearch.password: "gJRr45HLoRVzoqyRaWxO" ``` 如下圖: 修改配置檔案 2:【瀏覽器訪問kibana】:點選bin目錄下的kibana.bat檔案,啟動成功後cmd視窗如下圖所示,不要關閉視窗。 啟動kibana kibana命令視窗 http://localhost:5601/。輸入賬戶名和密碼:賬戶名和密碼是上面自動設定時提到過的 username: "elastic" password: "xxx" 登入成功如下圖所示: kibana的頁面

logstash的安裝

1,【配置檔案修改】:在logstash-6.3.0\bin目錄下,新建配置檔案logstash.conf,並新增如下配置(以下有兩種配置,選取一種就好了):

第一種配置為讀取控制檯日誌(我用的就是這第一種):如下: ```java

讀取控制檯日誌

input { stdin { } }

input { tcp { host => "127.0.0.1" port => 9250 mode => "server"

tags => ["tags"]

codec => json_lines
}

}

output { stdout { codec => rubydebug } }

output { stdout{codec =>rubydebug} elasticsearch { hosts => ["localhost:9200"] index => "logback-%{+YYYY.MM.dd}" user => "elastic" password => "xxx" } } ``` 第二種是讀取檔案中的日誌:如下

```java input { file { path => "c:/opt/logs/java-contract-info.log" # 日誌檔案 type => "elasticsearch" discover_interval => 3 #心跳監聽日誌檔案是否改變 start_position => "beginning" #從檔案開始處讀寫 } }

output { stdout{ codec => rubydebug } elasticsearch { hosts => "localhost:9200" index => "logstash-%{+YYYY.MM.dd}" user => "elastic" password => "xxx" } } (這裡要講解一下,上面配置中最值得注意的是:output.elasticsearch.index:"logstash-%{+YYYY.MM.dd}" 這裡預設建立了一個名為"logstash-日期"的索引,在kibana中會用到 ) ![新增配置檔案](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/03026c4153ad48c1aa803f48a14105b4~tplv-k3u1fbpfcp-zoom-1.image) 2,**【啟動logstash】**:cmd進入到logstash-6.3.0\bin目錄下,執行命令java logstash -f logstash.conf ``` 啟動logstash 執行命令後看到:Successfully started Logstash API endpoint {:port=>9600}的輸出表示Logstash 啟動完成,不要關閉這個視窗,因為Logstash 會一直監聽我們的idea控制檯,這個cmd視窗也是不可編輯狀態,如果idea控制檯有能匹配上的日誌(注意並非控制檯所有日誌都會在這個視窗打印出來,只有格式能匹配上的才會列印),會在這裡按照格式輸出。

整合

經過上面繁瑣的配置後,在springboot中整合就比較簡單了。將控制檯的日誌輸出到kibana中進行視覺化查詢和分析,不需要寫程式碼(ElasticsearchConfig、EKLController、ESRepository、ESData什麼的都不需要),只需要新增依賴並做一個配置xml檔案。如下步驟:

1,新增pom依賴:

先看一下我的專案結構。在模組的pom檔案中新增以下配置檔案。(新增之前:如果pom檔案中已經有spring-boot-starter-web這個依賴,要新增exclusion排除重複的log包引用,沒有就不用管。)

排除重複包的語句: xml <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions>

專案結構 在需要搭建日誌系統的模組新增pom依賴的語句: ```xml

    <!-- Java High Level REST Client -->
    <!--<dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.5.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
            </exclusion>
        </exclusions>
    </dependency>-->
    <!--logstash-->
    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>5.2</version>
    </dependency>
    <dependency>
        <groupId>net.logstash.log4j</groupId>
        <artifactId>jsonevent-layout</artifactId>
        <version>1.6</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <exclusions>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
            </exclusion>
        </exclusions>
        <version>1.1.8</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.8</version>
    </dependency>

``` PS:上面的幾個依賴為什麼要註釋掉呢,因為只做日誌的定位和分析似乎用不上 上面註釋掉的jar包。

2,新增logback.xml配置檔案:

從上面的專案目錄結構圖中不難看出,我將日誌的配置檔案logback.xml與springboot的配置檔案放在了同一個目錄下。 具體的logback.xml的內容如下:

```xml

127.0.0.1:9250 utf8 %msg%n

<!--deliver_log是日誌輸出的名字-->
<logger name="deliver_log" additivity="false" level="INFO">
    <!--appender-ref為對映的配置名-->
    <appender-ref ref="deliver_log_appender"/>
</logger>

``` 輸出關係 springboot方面就以上的配置就OK了,不需要寫其他的程式碼了。配置完成後啟動springboot

使用

我們訪問:localhost:5601後進入到kibana主頁面。 點選右側最上面的選單Discover,系統中的名為“deliver_log”輸出的日誌會展示在這裡,注意得有日誌了才會展示在下面。如下 kibana日誌展示頁

1,日誌定位

在discover上方的命令輸入欄中:輸入條件即可查詢到相關的日誌,多條件查詢可以使用and ,or等連線符。跟sql語句很相似 日誌定位

2,日誌分析

1:檢視索引管理

日誌分析之前需要建立索引模式,只有建立了索引模式,索引中的欄位才能進行聚合的統計或其他操作。

點選:管理》索引管理可以看到我們的索引,後面有一列文件數。建立索引後,如果索引對應的log沒有日誌的輸出,那麼文件數就是0,文件數為0的索引是無法建立索引模式的。也就是說,在建立說有模式之前,一定要現有日誌輸出(無論時輸出在控制檯還是輸出在檔案中。)

ps:可能有同學會有疑問,為什麼索引管理中的名稱是logback-2020.11.24。這是因為我們在前幾步中,logstash-6.3.0\bin\logstash.conf中配置的,這個名稱是自定義的,可更改的。 索引管理

2:建立索引模式

索引名稱字首+萬用字元。(如果匹配不到值,但是在索引管理中又能看到那個索引名稱,那肯定索引沒資料,這時候咱們需要先進行日誌輸出,把程式業務邏輯的日誌輸出出來,才能匹配上。)點選下一步 建立索引模式第一步 時間篩選欄位名稱選擇下圖所示,然後點選建立索引模式。 在這裡插入圖片描述

建立完成後,我們滑鼠下拉,可以看見索引模式中包含了我們的實體自定義的欄位名,也包含了幾個elk系統自帶的欄位名。這些我們實體自定義的欄位名就可以用來建立視覺化的圖表。

索引欄位名 ps:如果建立索引後,欄位後面沒有“可搜尋、可聚合的”綠色小點點,那麼需要點選一下重新整理,隨後按確定。 重新整理索引欄位

3:建立檢視

如下操作:視覺化》點選+號》需要哪種檢視(自定義,我這裡選擇的是表格) 建立檢視 上一步操作我選擇的是表格。所以檢視會在右邊的表格顯示出來。 左邊是配置聚合函式的。當然聚合函式不用手寫,直接在左邊的下拉框可以點出來。 比如我選擇目前的elk收集了6條打印出來的實體日誌,每個日誌中都有我的實體中的message欄位,那我想查詢一下每個message的數量並且展示出來,類似:message,count(message)。就可以進行如下選擇: 1:指標選:計數 2:點選儲存桶,點選拆分行。欄位選擇message,排序依據選擇指標:計數 3:點選上面的綠色三角形 執行按鈕,就可以得到查詢結果了 在這裡插入圖片描述

總結

之前的日誌統計一直用的阿里雲的日誌服務,跟這個功能差不多,但是阿里雲的日誌服務是收費的,所以自個在研究這個elk,還是挺實用的。這次研究elk, 周同學的部落格給了我很大啟發,大家可以去看看。 時間不充足,部落格中難免有疏漏錯誤之處,歡迎指正。elk是一個很龐大的系統,只學會怎麼用還是不夠的,以後我也會多來更新學習體會,歡迎互相交流