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

在上一篇文章《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數據分析:這個對於數據分析師,還有算法工程師都是有所裨益的。

vdocker安裝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三個應用之間創建連接也需要一點時間。

vspringboot整合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. 創建索引

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

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

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

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

2. 查看收集日誌

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

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

3. 添加過濾條件,查找符合條件的日誌

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

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}"
        }
    }
}

vkibana漢化

1. 進入kibana容器

docker exec -it kibana /bin/bash

2. 編輯文件

vi /opt/kibana/config/kibana.yml

修改該文件 在文件最後加上一行配置

i18n.locale: zh-CN

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

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

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

v源碼地址

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


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平臺的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!

<script type="text/javascript">// </script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章