3

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建 - 超级小霸王

 1 year ago
source link: https://www.cnblogs.com/zhouxiaoben/p/17234464.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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.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-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的功能远远不限于此,还可以查看不同维度的数据视图报表,有兴趣的童鞋可以研究研究。觉得有用的话,一键三连~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK