基於ELK打造強大的日誌收集分析系統(springboot2+logback+logstash+elasticsearch+kibana)

前言

上一代的日誌分析系統springboot+log4j+flume+kafka彷彿還是昨天,現在已經流行起了新一代的springboot2+logback+logstash+elasticsearch的日誌分析系統,藉助es強大的生態圈以及全文搜索能力,實現日誌收集/分析/檢索不再是難事。

日誌收集分爲兩種情況:

  • (本文)logback直接輸出到logstash,通過Tcp/Socket等傳輸(網絡開銷),當量太大時Logstash會做一個緩存隊列處理,減少了filebeat去讀取抓取日誌的步驟。
  • logback輸出日誌到日誌文件,filebeat實時抓取日誌文件(性能開銷),再傳輸到logstash。

第二種情況的舊版flume方案就存在很大的缺點:在日誌的產生端LogServer服務器重,部署FlumeAgent,然後實時監控產生的日誌,再發送至Kafka。每一個FlumeAgent都佔用了較大的系統資源,有時候LogServer性能開銷大,CPU資源尤其緊張,所以實時收集分析日誌,就必須交給一個更輕量級佔用資源更少的日誌收集框架,例如filebeat

什麼是ELK?

在這裏插入圖片描述
功能上看,ElasticSearch負責數據的存儲和檢索,Kibana提供圖形界面便於管理,Logstash是個日誌中轉站負責給ElasticSearch輸出信息。

在這裏插入圖片描述
流程上看,Logstash收集AppServer產生的Log,並存放到ElasticSearch集羣中,而Kibana則從ES集羣中查詢數據生成圖表,再返回給Browser。

Logstash部分


下載&安裝logstash

  1. logstash可以從以下地址下載,logstash和elasticsearch的版本要匹配,因爲我們用的es是6.8.1,所以這裏用了6.8.1的logstash,如果你是7.3.0則用7.3.0對應起來即可。
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.1.tar.gz
  1. 這個包無論是windows或者linux都可用,解壓即用
  2. (Linux下)cd到logstash目錄下的bin目錄,輸入 sh ./logstash -e 'input { stdin { } } output { stdout {} }' ,輸入任意命令測試是否成功,這是標準手動輸入輸出模式。

配置logstash

  1. 進入bin目錄,copy一份logstash-sample.conf文件並重命名爲到logstash.conf(或者直接新建一個logstash.conf文件),修改爲以下內容(先註釋掉elasticsearch部分,查看控制檯是否輸出,判斷logback->logstash是否生效!!!):
# Logback -> Logstash -> Elasticsearch pipeline.
# by zhengkai.blog.csdn.net
input {
  tcp {
  
    host => "127.0.0.1"
    port => 9250
    mode => "server"
    tags => ["tags"]
    codec => json_lines
    }
}

output {
  #控制檯直接輸出
  stdout{
    codec => rubydebug
  }
  #可以註釋掉elasticsearch部分,查看控制檯是否輸出,判斷logback->logstash是否生效,@zhengkai.blog.csdn.net
   elasticsearch {
     hosts => ["127.0.0.1:9200"]
     action => "index"
     index => "mylog"
   }

}

  1. 修改pipelines.yml文件
 - pipeline.id: test
   pipeline.workers: 1
   pipeline.batch.size: 1
   #config.string: "input { stdin { } } output { stdout {} }"
   path.config: "/SWDTOOLS/logstash-6.8.1/config/logstash.conf"
  1. 運行logstash.bat(windows) ,logstash.sh(linux)

補充一點,output配置中的ElasticSearch部分是通過logstash-output-elasticsearch插件的方式實現的,鏈接是官方插件手冊,可供查詢詳細配置 https://www.elastic.co/guide/en/logstash/6.8/plugins-outputs-elasticsearch.html

ElasticSearch部分


ElasticSearch下載和運行

ElasticSearch

關於es部分,可以之前的文章pringBoot2整合ElasticSearch(包含ElasticSearch入門+spring-boot-starter-data-elasticsearch)

  1. 下載 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.1.zip,當然如果太慢可以自己換aria2下載,(另外,如果從官網https://www.elastic.co/cn/downloads/elasticsearch下載Elasticsearch,下載到的版本太新,7.X可能存在兼容性問題,最好Logstash和ElasticSearch一樣都是6.8.1版本)
  2. 進入/bin目錄,chmod +x elasticsearch 進行授權
  3. 無需額外配置,可以以默認配置運行
  4. 運行./elasticsearch -d即可(Ubuntu直接運行 sh elasticsearch 會報錯,在Windows下運行 elasticsearch.bat 則沒問題)
moshow@moshow-ThinkCentre-M900:~/Development/Environment/elasticsearch-6.8.1/bin$ sh elasticsearch
elasticsearch: 17: elasticsearch: source: not found
elasticsearch: 1: elasticsearch: : Permission denied
elasticsearch: 21: elasticsearch: Bad substitution
  1. 打開http://localhost:9200/驗證是否成功
{
  "name" : "bOUWfou",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "l0CZWkdcTdCo6pZFO_jU4A",
  "version" : {
    "number" : "6.8.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "1fad4e1",
    "build_date" : "2019-06-18T13:16:52.517138Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

SpringBoot&Logback部分


Maven依賴

<!-- https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder -->
<dependency>
	<groupId>net.logstash.logback</groupId>
	<artifactId>logstash-logback-encoder</artifactId>
	<version>5.3</version>
</dependency>

Logback TCP Appenders配置

在這裏插入圖片描述

<?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>127.0.0.1:9250</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

Controller

  • (Suggest)使用lombok的@Slf4j註解,可以直接log.info()/log.error()調用slf4j進行輸出
  • (不建議)或者使用原生private final Logger log = LoggerFactory.getLogger(getClass());
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@Slf4j
public class DemoController {

    @GetMapping
    public Object index(){
        String msg="Oh My God ,System Error when "+ DateUtil.now();
        log.error(msg);
        return ResponseEntity.ok(msg);
    }
}
  • 查看Logstash控制檯輸出情況
    在這裏插入圖片描述

LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError問題

  • es無法連接情況,多數是es不可用或者有代理之類的情況:
    在這裏插入圖片描述

Kibana部分


下載&安裝

  1. wget或者aria2c下載6.8.1版的Kibana
    wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.1-linux-x86_64.tar.gz

  2. 解壓文件 tar -xzf kibana-6.8.1-linux-x86_64.tar.gz

  3. 進入kibana的bin目錄,運直接./bin/kibana
    在這裏插入圖片描述

  4. 訪問 http://localhost:5601/app/kibana
    在這裏插入圖片描述

  5. 建立一個新IndexPatten,Filter選擇時間戳即可在這裏插入圖片描述在這裏插入圖片描述

  6. 查看已經建立的index patten,Time Filter by Timestamp,時間過濾器按照指定的時間段展示搜索結果。設置了 index contains time-based events 和 time-field 的索引模式可以使用時間過濾器。

在這裏插入圖片描述
Index Patten索引模式

要使用Kibana,就需要通過配置一個或多個索引模式來告訴它您想探索的 Elasticsearch 索引(相當於創建es連接)。創建連接之後可以:

  • Discover中以交互方式探索您的數據。
  • Visualize中以圖表,表格,儀表,標籤雲等形式顯示數據。
  • Canvas演示文稿中展示您的數據。
  • 如果您的數據包含地理數據,請使用地圖Maps將其可視化。

另外,

  • 如果您的索引中含有一個時間戳字段,並且您想將這個字段用於執行基於時間比較的操作,請選擇 索引含有帶時間戳的事件 選項,Kibana 會讀取索引映射並列出包含時間戳的所有字段,從中選擇您需要的字段即可(例如@TimeStamp)。
  • 默認情況下,Kibana 會限制基於時間的索引模式的通配符擴展,(因爲這意義不大,且浪費時間,儘量用正常的比較操作)符,範圍爲當前選定時間內的索引數據。點擊“當搜索時不要展開索引模式”選項來禁用此行爲(即不走時間索引)。

Discover數據探索模塊

數據探索(Discover)頁面負責交互式地探索es數據:

  • 可以訪問與選定索引模式匹配的每個索引中的每個文檔。
  • 可以提交搜索請求、過濾搜索結果、查看文檔數據。
  • 還可以看到與搜索查詢匹配的文檔數,並獲取字段值的統計信息。
  • 如果索引模式中配置了時間字段,您還可以在這個頁面的頂部看到基於時間分佈的文檔數量柱狀圖。

在這裏插入圖片描述
Timelion時序控件

時序控件(Timelion)是一款時間序列數據可視化工具,它可以將多種獨立的數據源合併呈現到一張視圖上。它是由一個簡單的表達式語言驅動的,用來檢索時間序列數據,執行計算得出複雜問題的答案,並可視化結果。
Timelion 可以讓您輕鬆獲得如下問題的答案:

  • 過去某段時間頁面的 UV 量是多少?
  • 本週五和上週五的流量有多少差異?
  • 本站今天來自日本的訪客佔多少百分比?
  • 標普500指數過去10天的移動平均值是多少?
  • 過去兩年所有的搜索請求總量有多少?

更多詳情可以訪問官方使用手冊 https://www.elastic.co/guide/cn/kibana/current/timelion-create.html

.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct')

在這裏插入圖片描述

效果演示

  1. 打開 http://localhost:9999/logstash/ ,看到 Oh My God ,System Error when 2019-08-10 18:35:00 的返回信息。
    在這裏插入圖片描述
  2. 查看Logstash控制檯,發現stdout輸出以及沒有es報錯提示。
    在這裏插入圖片描述
  3. 用插件elasticsearch-head查看ElasticSearch,默認連接地址localhost:9200,看到日誌傳輸成功
    在這裏插入圖片描述
  4. 進入Kibana的Discover模塊進行搜索 http://localhost:5601/app/kibana#/discover
    在這裏插入圖片描述

後言

關於探索Kibana更多功能可以查看官方的中文手冊 https://www.elastic.co/guide/cn/kibana/current/index.html

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