• 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启动成功

    image.png

    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启动成功

    image.png

    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.logbackgroupId>
       <artifactId>logback-classicartifactId>
    dependency>
    <dependency>
       <groupId>net.logstash.logbackgroupId>
       <artifactId>logstash-logback-encoderartifactId>
       <version>7.3version>
    dependency>
    

    在resources文件夹下,创建logback.xml

    
    <configuration debug="false">
        
        <springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="default"/>
        
        <property name="LOG_HOME" value="/home"/>
        
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFOlevel>
            filter>
            <withJansi>falsewithJansi>
            <encoder>
                
                
                <pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) -- %boldMagenta([%thread]) %boldCyan(%logger) : %msg%npattern>
                <charset>UTF-8charset>
            encoder>
        appender>
    
        
        <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            
            <destination>你的虚拟机IP地址:5043destination>
            
            <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                
                <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}.logFileNamePattern>
                
                <MaxHistory>30MaxHistory>
            rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
            encoder>
            
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>10MBMaxFileSize>
            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-03-04 233740.png

    可以看到springboot的3月4号日志已经生成,下面进一步查看日志的内容。
    屏幕截图 2023-03-04 233829.png

    点击左侧菜单,选择Discover,创建数据视图,因为索引名称前缀是xiaobawang-,所以索引模式填写xiaobawang-*
    就可以匹配每天生成的日志。
    屏幕截图 2023-03-04 233903.png

    屏幕截图 2023-03-04 233928.png

    至此,ELK已经搭建完成,但kibana的功能远远不限于此,还可以查看不同维度的数据视图报表,有兴趣的童鞋可以研究研究。觉得有用的话,一键三连~

  • 相关阅读:
    springboot整合MongoDB进行增删改查(详细)
    C# winform UI中Timer的最小时间间隔是55ms,而不是1ms
    php上传图片,yii上传图片,(base64上传)
    中集集团全球港航AI高科技独角兽中集飞瞳港口航运新枢纽人工智能技术走向成熟全球前三大船公司及港口码头应用落地港口智能化码头智能化
    yolov5调用zed相机实现三维社交距离检测(单类别)
    操作系统之零拷贝
    MySQL日志
    iptables常用命令
    抽象类和接口
    5个例子学会Pandas中的字符串过滤
  • 原文地址:https://www.cnblogs.com/zhouxiaoben/p/17234464.html