天天看點

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

前言

去年公司由于不斷發展,内部自研系統越來越多,是以後來搭建了一個日志收集平台,并将日志收集功能以二方包形式引入自研系統,避免每個自研系統都要建立一套自己的日志子產品,節約了開發時間,管理起來也更加容易。

這篇文章主要介紹ELK最新版本的搭建,

ELK介紹

  • Elasticsearch 是一個分布式、Restful 風格的搜尋和資料分析引擎,能夠解決不斷湧現出的各種用例。作為 Elastic Stack 的核心,Elasticsearch 會集中存儲您的資料,讓您飛快完成搜尋,并對資料進行強大的分析。
  • Logstash 是免費且開放的伺服器端資料處理管道,能夠從多個來源采集資料,轉換資料,然後将資料發送到資料庫中。
  • Kibana 是一個免費且開放的使用者界面,能夠讓您對 Elasticsearch 資料進行可視化,從跟蹤查詢負載,到檢視應用請求的整個過程,都能輕松完成。

搭建平台版本

平台 版本
linux centos stream 9
java openjdk 17
elasticsearch 8.6.2
logstash 8.6.2
kibana 8.6.2
VMware Workstation Pro 17

安裝

首先在linux虛拟機上安裝docker 先解除安裝舊版本

sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
複制代碼           

更新yum

yum update
複制代碼           

設定倉庫

yum install -y yum-utils device-mapper-persistent-data lvm2
複制代碼           

使用阿裡雲鏡像位址

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
複制代碼           

安裝 Docker Engine-Community

sudo yum install docker-ce docker-ce-cli containerd.io
複制代碼           

設定docker開機啟動并啟動docker

sudo systemctl enable docker
sudo systemctl start docker
複制代碼           

至此,docker已安裝完成,可以使用docker -v檢視版本,接下來就要安裝三大金剛了

docker pull elasticsearch:8.6.2
docker pull kibana:8.6.2
docker pull logstash:8.6.2
複制代碼           

啟動

elasticsearch

接着先挂載elasticsearch的配置檔案,友善以後修改 首先建立elasticsearch.yml檔案

cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.seed_hosts: 0.0.0.0
network.bind_host: 0.0.0.0
http.port: 9200

# Enable security features
xpack.security.enabled: false

xpack.security.enrollment.enabled: false

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: false

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: false

複制代碼           

建立elasticsearch容器

docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -v /home/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e "discovery.type=single-node" elasticsearch:8.6.2
複制代碼           

啟動elasticsearch容器

docker start elasticsearch
複制代碼           

浏覽器輸入http://你的虛拟機ip:9200 顯示如下,說明es啟動成功

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

kibana

建立kibana容器,這裡使用到漢化 "-e I18N_LOCALE=zh-CN"

docker run -d --name kibana --link elasticsearch:elasticsearch -e "I18N_LOCALE=zh-CN" -p 5601:5601 kibana:8.6.2
複制代碼           

啟動kibana

docker start kibana
複制代碼           

輸入http://你的虛拟機ip:5601/ 此時kibana啟動成功

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

logstash

在linux的/home目錄下建立logstash.yml檔案,其中index是索引的名稱,我們使用“xiaobawang-”字首加時間來生成每天的索引。

# 輸入端
input {
  stdin { } 
  #為logstash增加tcp輸入口,後面springboot接入會用到
  tcp {
      mode => "server"
      host => "0.0.0.0"
      port => 5043
      codec => json_lines
  }
}
 
#輸出端
output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    hosts => ["http://你的虛拟機ip位址:9200"]
    # 輸出至elasticsearch中的自定義index名稱
    index => "xiaobawang-%{+YYYY.MM.dd}"
  }
}
複制代碼           

然後啟動logstash,這裡配置檔案做了映射,/home/logstash.yml映射到/usr/share/logstash/pipeline/logstash.yml

docker run -d --name logstash -p 5043:5043 -p 5044:5044  --privileged=true -v /home/logstash.yml:/usr/share/logstash/pipeline/logstash.yml logstash:8.6.2
複制代碼           

進入logstash容器

docker exec -it logstash /bin/bash
複制代碼           

安裝json_lines所需的插件

/usr/share/logstash/bin/logstash-plugin install logstash-codec-json_lines
複制代碼           

重新開機logstash,至此elk已全部安裝完成了。

docker restart logstash
複制代碼           

Springboot整合logstash

下面使用logstash來将日志發送到elasticsearch,這裡以springboot為例。

建立一個springboot項目,引入如下包:

<dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
</dependency>
<dependency>
   <groupId>net.logstash.logback</groupId>
   <artifactId>logstash-logback-encoder</artifactId>
   <version>7.3</version>
</dependency>
複制代碼           

在resources檔案夾下,建立logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--擷取springboot的yml配置資訊-->
    <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/>
    <!--定義日志檔案的存儲位址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_HOME" value="/home"/>
    <!--輸出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <withJansi>false</withJansi>
        <encoder>
            <!--<pattern>%d %p (%file:%line)- %m%n</pattern>-->
            <!--格式化輸出:%d:表示日期    %thread:表示線程名     %-5level:級别從左顯示5個字元寬度  %msg:日志消息    %n:是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) -- %boldMagenta([%thread]) %boldCyan(%logger) : %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--  日志發送至logstash  -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- logstash的伺服器位址和通信端口 -->
        <destination>你的虛拟機IP位址:5043</destination>
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- 在elasticsearch的index中追加applicationName字段  -->
            <customFields>{"applicationName":"${applicationName}"}</customFields>
        </encoder>
    </appender>

    <!-- 按照每天生成日志檔案 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志檔案輸出的檔案名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志檔案保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級别從左顯示5個字元寬度%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志檔案最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 日志輸出級别 -->
    <root level="INFO">
        <appender-ref ref="logstash"/>
        <appender-ref ref="console"/>
    </root>
</configuration>
複制代碼           

建立一個controller請求

@RestController
public class TestController {

    private final static Logger logger= LoggerFactory.getLogger(TestController.class);
    @RequestMapping("/myTest")
    public void test(){
        logger.info("日志開始"+System.currentTimeMillis());
        logger.info("日志結束"+System.currentTimeMillis());
    }
}

複制代碼           

通路完請求後,進入Stack Management找到索引管理

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

可以看到springboot的3月4号日志已經生成,下面進一步檢視日志的内容。

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

點選左側菜單,選擇Discover,建立資料視圖,因為索引名稱字首是xiaobawang-,是以索引模式填寫xiaobawang-* 就可以比對每天生成的日志。

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建
2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

至此,ELK已經搭建完成,但kibana的功能遠遠不限于此,還可以檢視不同次元的資料視圖報表,有興趣的童鞋可以研究研究。

繼續閱讀