ELK日誌收集分析系統及與Springboot的整合

ELK日誌收集分析系統

ELK Stack 是Elasticsearch、Logstash、Kiban三個開源軟件的組合。在實時數據檢索和分析場合,三者通常是配合共用,而且又都先後歸於 Elastic.co 公司名下,故有此簡稱。

基本組成軟件

  • Elasticsearch是實時全文搜索和分析引擎,提供蒐集、分析、存儲數據三大功能;是一套開放REST和JAVA API等結構提供高效搜索功能,可擴展的分佈式系統。它構建於Apache Lucene搜索引擎庫之上。
  • Logstash是一個用來蒐集、分析、過濾日誌的工具。它支持幾乎任何類型的日誌,包括系統日誌、錯誤日誌和自定義應用程序日誌。它可以從許多來源接收日誌,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets和Elasticsearch。
  • Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日誌數據。它利用Elasticsearch的REST接口來檢索數據,不僅允許用戶創建他們自己的數據的定製儀表板視圖,還允許他們以特殊的方式查詢和過濾數據。

ELK的基於docker的搭建

注:會消耗2G+服務器內存

#1.新建elk文件夾
mkdir elk
#2.進入文件夾
cd elk
#3.創建 docker-compose.yml 文件並填入下文內容
vim docker-compose.yml
#4.新建文件及文件夾對應 docker-compose 的掛載目錄
mkdir es
cd es
mkdir plugins
mkdir data
#5.給設置data文件夾設置777權限 不然es啓動會報錯
chmod 777 data/
cd ..
mkdir logstash
cd logstash/
#6.創建 logstash.conf 文件並填入下文內容
vim logstash.conf
#7.通過命令啓動docker容器
docker-compose up -d
#通過命令查看elk的狀態
docker ps

docker ps內容

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                            NAMES
d0784ecdcc5d        logstash:7.8.0         "/usr/local/bin/dock…"   22 seconds ago      Up 21 seconds       5044/tcp, 0.0.0.0:4560->4560/tcp, 9600/tcp       logstash
8eb6c197b6f4        kibana:7.8.0           "/usr/local/bin/dumb…"   22 seconds ago      Up 21 seconds       0.0.0.0:5601->5601/tcp                           kibana
f266b48803a9        elasticsearch:7.8.0    "/tini -- /usr/local…"   22 seconds ago      Up 21 seconds       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch

可以看到三個都已啓動

docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.8.0
    container_name: elasticsearch
    restart: always
    environment:
      - "cluster.name=elasticsearch" #設置集羣名稱爲elasticsearch
      - "discovery.type=single-node" #以單一節點模式啓動
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #設置使用jvm內存大小
      - TZ=Asia/Shanghai
    volumes:
      - ./es/plugins:/usr/share/elasticsearch/plugins #插件文件掛載
      - ./es/data:/usr/share/elasticsearch/data #數據文件掛載
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: kibana:7.8.0
    container_name: kibana
    links:
      - elasticsearch:es #可以用es這個域名訪問elasticsearch服務
    depends_on:
      - elasticsearch #kibana在elasticsearch啓動之後再啓動
    environment:
      - SERVER_NAME=kibana
      - "elasticsearch.hosts=http://es:9200" #設置訪問elasticsearch的地址
      - XPACK_MONITORING_ENABLED=true
      - TZ=Asia/Shanghai
    ports:
      - 5601:5601
  logstash:
    image: logstash:7.8.0
    container_name: logstash
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #掛載logstash的配置文件
    depends_on:
      - elasticsearch #kibana在elasticsearch啓動之後再啓動
    links:
      - elasticsearch:es #可以用es這個域名訪問elasticsearch服務
    ports:
      - 4560:4560

logstash.conf

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
    type => "business"
  }
}
output {
  elasticsearch {
    hosts => ["es:9200"]
    action => "index"
    codec => json
    index => "%{type}-%{+YYYY.MM.dd}"
    template_name => "business"
  }
}

訪問http://服務器ip:9200/可以看到以下 json 字符串

{
    "name": "f266b48803a9",
    "cluster_name": "elasticsearch",
    "cluster_uuid": "yWdlWaN8RbOTuMZBJ7RRMg",
    "version": {
        "number": "7.8.0",
        "build_flavor": "default",
        "build_type": "docker",
        "build_hash": "757314695644ea9a1dc2fecd26d1a43856725e65",
        "build_date": "2020-06-14T19:35:50.234439Z",
        "build_snapshot": false,
        "lucene_version": "8.5.1",
        "minimum_wire_compatibility_version": "6.8.0",
        "minimum_index_compatibility_version": "6.0.0-beta1"
    },
    "tagline": "You Know, for Search"
}

訪問http://服務器ip:5601/查看Kibana狀況
在這裏插入圖片描述

如需修改Kibana爲中文,則執行以下命令

#進入kibana容器
docker exec -it kibana bash
#切換進入 config 目錄
cd config/
#編輯 kibana.yml 文件
vi kibana.yml
#在文件的最後添加一行
i18n.locale: "zh-CN"
#退出容器
exit
#重啓kibana容器
docker restart kibana

再次訪問http://服務器ip:5601/就可以看到界面變中文了

在這裏插入圖片描述

至此 ELK基於docker搭建完成

Springboot整合ELK實現日誌收集

在spring boot 項目中引入依賴

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

在resource目錄中新建logback-spring文件 用於收集日誌並將日誌轉發到logstash

注:要修改服務器ip

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--應用名稱-->
    <springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="springBoot"/>
    <!--LogStash訪問host-->
    <springProperty name="LOG_STASH_HOST" scope="context" source="logstash.host" defaultValue="服務器ip"/>
    <!-- 控制檯輸出日誌 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%level] [%c:%L] - %msg%n</pattern>
        </encoder>
    </appender>
    <!--每天生成一個日誌文件,保存30天的日誌文件。-->
    <appender name="DayFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/log.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/log.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%level] [%thread] [%c:%L] - %msg%n</pattern>
        </encoder>
    </appender>

    <!--業務日誌輸出到LogStash-->
    <appender name="LOG_STASH_BUSINESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${LOG_STASH_HOST}:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>Asia/Shanghai</timeZone>
                </timestamp>
                <!--自定義日誌輸出格式-->
                <pattern>
                    <pattern>
                        {
                        "service": "${APP_NAME:-}",
                        "level": "%level",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger",
                        "traceId": "%X{traceId:-}",
                        "message": "%message",
                        "stack_trace": "%exception"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!--指定logger name爲包名或類全名 指定級別 additivity設置是否傳遞到root logger -->
    <logger name="slf4j" level="INFO" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="DayFile"/>
        <appender-ref ref="LOG_STASH_BUSINESS"/>
    </logger>
    <!--slf4j2包下的類在ERROR級別時候傳遞到root logger中-->
    <logger name="slf4j2" level="ERROR"/>
    <!--根logger控制-->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="DayFile"/>
        <appender-ref ref="LOG_STASH_BUSINESS"/>
    </root>
</configuration>

啓動項目輸出日誌後,logstash就會收集日誌

訪問http://服務器ip:5601並按如下設置

1.進入Stack Management

在這裏插入圖片描述

2.開始創建索引模式

在這裏插入圖片描述

3.定義索引模式

在這裏插入圖片描述4.創建索引模式

在這裏插入圖片描述

5.創建完成後 效果如下
在這裏插入圖片描述
6.查看日誌

在這裏插入圖片描述

7.可以根據各種條件篩選日誌

在這裏插入圖片描述

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