前言

去年公司由于不断发展,内部自研体系越来越多,所今后来搭建了一个日志搜集渠道,并将日志搜集功用以二方包形式引进自研体系,防止每个自研体系都要建立一套自己的日志模块,节省了开发时刻,办理起来也愈加简单。
这篇文章首要介绍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的功用远远不限于此,还能够查看不同维度的数据视图报表,有兴趣的童鞋能够研讨研讨。觉得有用的话,一键三连~