SpringBoot進階教程(七十四)整合ELK

語言: CN / TW / HK

在上一篇文章 《SpringBoot進階教程(七十三)整合elasticsearch 》 ,已經詳細介紹了關於elasticsearch的安裝與使用,現在主要來看看關於ELK的定義、安裝及使用。

v 簡介

1.什麼是ELK?

ELK 是elastic公司提供的一套完整的日誌收集以及展示的解決方案,是三個產品的首字母縮寫,分別是ElasticSearch、Logstash 和 Kibana。

ElasticSearch: ElasticSearch簡稱ES,它是一個實時的分散式搜尋和分析引擎,它可以用於全文搜尋,結構化搜尋以及分析。它是一個建立在全文搜尋引擎Apache Lucene基礎上的搜尋引擎,使用Java語言編寫。關於ES的更多介紹,可以看看 《SpringBoot進階教程(七十三)整合elasticsearch 》

Logstash: Logstash是一個具有實時傳輸能力的資料收集引擎,用來進行資料收集(如:讀取文字檔案)、解析,並將資料傳送給ES。

Kibana: Kibana為Elasticsearch提供了分析和視覺化的Web平臺。它可以在Elasticsearch的索引中查詢,互動資料,並生成各種維度表格、圖形。

2.ELK的用途

2.1問題排查: 我們常說,運維和開發這一輩子無非就是和問題在戰鬥,所以這個說起來很樸實的四個字,其實是沉甸甸的。很多公司其實不缺錢,就要穩定,而要穩定,就要運維和開發能夠快速的定位問題,甚至防微杜漸,把問題殺死在搖籃裡。日誌分析技術顯然問題排查的基石。基於日誌做問題排查,還有一個很帥的技術,叫全鏈路追蹤,比如阿里的eagleeye 或者Google的dapper,也算是日誌分析技術裡的一種。

2.2監控和預警: 日誌,監控,預警是相輔相成的。基於日誌的監控,預警使得運維有自己的機械戰隊,大大節省人力以及延長運維的壽命。

2.3關聯事件: 多個數據源產生的日誌進行聯動分析,通過某種分析演算法,就能夠解決生活中各個問題。比如金融裡的風險欺詐等。這個可以可以應用到無數領域了,取決於你的想象力。

2.4資料分析: 這個對於資料分析師,還有演算法工程師都是有所裨益的。

v docker安裝elk

1. 拉取映象

docker pull elasticsearch:7.5.1
docker pull logstash:7.5.1
docker pull kibana:7.5.1

注意各個版本儘量保持一致,否則可能會報錯。

2. 建立docker-compose.yml

因為elk涉及到多個映象,所以使用docker-compose的方式,會比較方便。如果還沒有安裝docker-compose的,可以看看這篇文章。

建立目錄: mkdir /usr/local/docker/elk

建立docker-compose.yml檔案 vi docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.5.1
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch" #設定叢集名稱為elasticsearch
      - "discovery.type=single-node" #以單一節點模式啟動
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #設定使用jvm記憶體大小
    volumes:
      - /usr/local/docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #外掛檔案掛載
      - /usr/local/docker/elk/elasticsearch/data:/usr/share/elasticsearch/data #資料檔案掛載
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.5.1
    container_name: kibana
    depends_on:
      - elasticsearch #kibana在elasticsearch啟動之後再啟動
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200 #設定訪問elasticsearch的地址
    ports:
      - 5601:5601
  logstash:
    image: logstash:7.5.1
    container_name: logstash
    volumes:
      - /usr/local/docker/elk/logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf #掛載logstash的配置檔案
    depends_on:
      - elasticsearch #kibana在elasticsearch啟動之後再啟動
    links:
      - elasticsearch:es #可以用es這個域名訪問elasticsearch服務
    ports:
      - 4560:4560

!wd 儲存。

3. 建立logstash-springboot.conf

建立 logstash目錄 mkdir /usr/local/docker/elk/logstash

cd logstash 進入logstash 目錄

建立logstash-springboot.conf配置檔案 vi logstash-springboot.conf

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "springboot-logstash-%{+YYYY.MM.dd}"
  }
}

cd .. 返回上一級目錄,即回到docker-compose所在的目錄( /usr/local/docker/elk )。

4. 啟動ELK

docker-compose up -d

訪問Kibana(訪問地址:http://ip:5601),會看到異常資訊 Cannot connect to the Elasticsearch cluster currently configured for Kibana. 再通過 docker ps -a 發現elasticsearch例項掛了。

通過 docker logs -f elasticsearch 可以看到,es容器裡的/usr/share/elasticsearch/data/nodes資料夾目錄沒有讀寫許可權,實際上是沒有宿主機/usr/local/es/data的讀寫許可權。

chmod 777 /usr/local/docker/elk/elasticsearch/data

然後重啟一下 docker-compose restart

請求url http://toutou.com:5601 ,搞定。

注意:如果啟動ELK之後馬上請求url,會提示 Kibana server is not ready yet ,等一會就好了。因為ELK三個應用之間建立連線也需要一點時間。

v springboot整合elk

1. 新增引用

        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.2</version>
        </dependency>

2. 新增logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!--應用名稱-->
    <property name="APP_NAME" value="myshop-demo-elk"/>
    <!--日誌檔案儲存路徑-->
    <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
    <contextName>${APP_NAME}</contextName>
    <!--每天記錄日誌到檔案appender-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!--輸出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以訪問的logstash日誌收集埠-->
        <destination>toutou.com:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

注意:appender節點下的destination需要改成自己的logstash服務地址,比如我的是:toutou.com:4560

如果logback.xml不知道怎麼配的話,可以看看這篇文章: SpringBoot入門教程(八)配置logback日誌

3. 新增測試Controller

/**
 * @author toutou
 * @date by 2021/2
 * @des   https://www.cnblogs.com/toutou
 */
@Slf4j
@RestController
public class IndexController {
    @GetMapping("/elk")
    public Result index() {
        String message = "logback ELK成功接入了,時間:" + new Date();
        log.info(message);
        return Result.setSuccessResult(message);
    }
}

關於springboot的整合就可以了,然後啟動SpringBoot應用就行。

v 配置kibana

請求url http://toutou.com:5601 ,點選Explore on my own。

1. 建立索引

依次按上圖中的步驟建立索引。

2. 檢視收集日誌

3. 新增過濾條件,查詢符合條件的日誌

4. 新增過濾條件

通過日誌查詢,我們會發現有很多debug的無效日誌,這種日誌可能不是太需要,而且會影響我們查詢真正有用的日誌。這樣我們就可以在收集日誌的時候,修改logstash-springboot.conf配置,通過logstash-springboot.conf來移除debug級別的日誌。更新後的配置如下:

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
    if [level] != "ERROR"  {
        elasticsearch {
            hosts => "es:9200"
            index => "springboot-logstash-%{+YYYY.MM.dd}"
        }
    }
}

v kibana漢化

1. 進入kibana容器

docker exec -it kibana /bin/bash

2. 編輯檔案

vi /opt/kibana/config/kibana.yml

修改該檔案 在檔案最後加上一行配置

i18n.locale: zh-CN

注意:zhe-CN和:號之間必須有個空格,否則kibana無法啟動

重啟,即可看到訪問的 kibana已漢化。

v 原始碼地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn

作者: 請叫我頭頭哥

出處: http://www.cnblogs.com/toutou/

關於作者:專注於基礎平臺的專案開發。如有問題或建議,請多多賜教!

版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我

聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角 推薦 一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!

<script type="text/javascript">// </script>