说明

以下基于 Centos7 ,需先自行安装 Docker 和 Docker Compose

搭建 ELK7

👇 是我自己搭建学习的脚本 ,有需要点击下载即可
搭建文件脚本
压缩包文件目录如下
在这里插入图片描述
在这里插入图片描述

1. elk 存放根目录

创建 elasticsearch 的存放路径

## 创建 elk 目录,创建指令如下
mkdir [dir]
## 创建完毕,进
入创建的目录下,准备编写 docker-compose.yaml
cd [dir]

使用 pwd 查看是否进入目录中
在这里插入图片描述

2. 编写 docker-compose.yaml

完整的 docker-compose.yaml

version: '3.7'

services:
  elasticsearch:
    image: elasticsearch:7.17.10
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true # 防止内存交换,提升性能
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g" # 设置 JVM 堆内存大小,建议根据系统资源调整
    networks:
      - elk-net
    ports:
      - "9200:9200"
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data

  logstash:
    image: logstash:7.17.10
    networks:
      - elk-net
    ports:
      - "5044:5044" # Logstash 的 Beats 输入端口
      - "9600:9600" # Logstash 的 HTTP API 端口
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline # 挂载 Logstash 配置目录 
    depends_on:
      - elasticsearch  # 确保 Elasticsearch 在 Kibana 之前启动
      - kibana
      
  kibana:
    image: kibana:7.17.10
    networks:
      - elk-net
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
      - I18N_LOCALE=zh-CN  # 设置 Kibana 的语言为中文
    depends_on:
      - elasticsearch  # 确保 Elasticsearch 在 Kibana 之前启动

# 设置网络,使当前 yaml处于同一个网络下
networks:
  elk-net:
    driver: bridge

3. 创建数据卷目录

数据卷: 我们在使用过程成会可能会产生一些数据,

  • 本地部署的时候,数据会直接在本地的规定的路径下生成数据文件
  • 容器化部署产生的数据在容器中,如果没有挂载本地,电脑重启 | 容器重启 就会导致数据丢失
  • 因此在启动程序的时候通常要进行数据挂载,避免执行的重启操作后数据丢失
## 在 elk 目录下创建数据卷目录
## -p 能一次创建多个 目录
# logstash
mkdir -p logstash/pipeline
# elasticsearch
mkdir -p elasticsearch/data

后续目录如下
在这里插入图片描述

  • 编写 logstash.conf

elk-20250215/logstash/pepeline/ 下创建 logstash.conf

在这里插入图片描述

input {
  tcp {
    port => 5044
    codec => json_lines
  }
}
 
output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "%{index_name}"  # 动态选择索引
  }

  stdout { codec => rubydebug }  # 输出到控制台,便于调试
}

在这里插入图片描述

4. 启动和停止 docker-compose.yaml

## 启动脚本
docker compose up -d
## 停止脚本
docker compose down
  • 启动
  1. 出现 Started 的状态代表服务启动成功
  2. 如果是第一次启动,如果没有对应的镜像,自动拉取镜像,拉取完毕后再执行启动操作
    在这里插入图片描述
  • 查看镜像是否启动
## 查看镜像服务启动
docker ps | grep 7.17

在这里插入图片描述

  • 停止服务
  1. 出现 Removed 的状态代表服务启动成功
    在这里插入图片描述

5. 访问页面

访问相应的页面,测试镜像服务是否成功启动
开放出来的端口,要根据 docker-compose.yaml 配置的映射关系来访问
生成环境中为保证安全,通常会将一些固定端口改成其他端口

elasticsearch

elasticsearch 映射的端口号是 9200 -> 9200 , 所以外部访问的端口为 9200
在这里插入图片描述

在这里插入图片描述

kibana

在这里插入图片描述

logstash

在这里插入图片描述

ELK 7 实现 SpringBoot 日志推送

引入依赖

在 pom.xml 的依赖中引入 logstash

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

编写logback配置信息

文件名称 logback-spring.xml
存放路径 src/main/resources
在这里插入图片描述

  • logback-spring.xml

配置文件中的 destination 指向的是自己服务器的 logstash 的端口
endcoder 的 customFields 可自定义参数在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="PROJECT_NAME" value="spring-rabbitmq-start"/>
    <property name="LOG_BASE" value="./logs"/>
    <property name="LOG_BACK_DIR" value="${LOG_BASE}/${PROJECT_NAME}_logs"/>
    <!-- INFO日志 -->
    <appender name="INFO_ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_BACK_DIR}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_BACK_DIR}/info_%d{yyyyMMddHH}_%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>120</maxHistory>
            <totalSizeCap>5GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>

    </appender>

    <!-- ERROR日志 -->
    <appender name="ERROR_ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_BACK_DIR}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_BACK_DIR}/error_%d{yyyyMMdd}_%i.log</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>10</maxHistory>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!-- 配置 Logback 输出到 Logstash -->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.188.153:5044</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"application": "spring-rabbitmq-start" }</customFields>
        </encoder>
    </appender>

    <!-- 配置 Console 输出日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] [%X{rpcId}] [%level]%C[%M]%L[%.-5120msg][%X{callChain}]%n</pattern>-->
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 配置日志级别 -->
    <logger name="org.springframework" level="WARN"/>
    <logger name="java.sql.Connection" level="INFO"/>
    <logger name="java.sql.ResultSet" level="INFO"/>
    <logger name="org.quartz.core.QuartzSchedulerThread" level="WARN"/>
    <logger name="org.mybatis.spring.SqlSessionUtils" level="WARN"/>

    <root level="INFO">
        <appender-ref ref="ERROR_ROLLING"/>
        <appender-ref ref="INFO_ROLLING"/>
        <appender-ref ref="LOGSTASH"/>
        <appender-ref ref="CONSOLE"/>  <!-- 添加控制台输出 -->
    </root>
</configuration>

修改logstash.yaml(可选)

filter 中的信息可按照需求自行修改

input {
  tcp {
    port => 5044
    codec => json_lines
  }
}

filter {
    ## 项目名称
    if [application] == "spring-rabbitmq-start" {
        # 添加条件过滤器,检查日志级别(假设字段为 `level`if [level] == "ERROR" {
            mutate { add_field => { "index_name" => "spring-rabbitmq-start-error-%{+YYYY.MM.dd}" } }
        } else if [level] == "INFO" {
            mutate { add_field => { "index_name" => "spring-rabbitmq-start-info-%{+YYYY.MM.dd}" } }
        } else if [level] == "WARN" {
            mutate { add_field => { "index_name" => "spring-rabbitmq-start-warn-%{+YYYY.MM.dd}" } }
        } else {
            mutate { add_field => { "index_name" => "spring-rabbitmq-start-other-%{+YYYY.MM.dd}" } }
        }
    } else {
         mutate { add_field => { "index_name" => "logstash-logs-%{+YYYY.MM.dd}" } }
    }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "%{index_name}"  # 动态选择索引
  }

  stdout { codec => rubydebug }  # 输出到控制台,便于调试
}

启动Springboot服务测试

服务启动
在这里插入图片描述

通过 kibana 查看日志日否录入

  1. 新增的 spring-rabbitmq-start-info-2025.02.21 就是刚推送的日志
  2. 通过对应的查询语句查询记录
    在这里插入图片描述

因为时区的不同可能会存在8小时的时间差
在这里插入图片描述

解决方法参考
logstash 数据采集时间差8小时问题及解决
解决logstash时区相差8小时问题最详细解答
在这里插入图片描述

kibana 查看时间是否正常在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐