当前位置: 首页 > news >正文

CSDN 完整教程:内网 Docker Compose 一键部署 ELK7.17,SpringBoot 接入日志(单机 + 集群完整版)

文章前言

需求背景

本地开发机器192.168.1.8,内网服务器192.168.1.140(大磁盘),需要搭建轻量化 ELK 日志平台收集 SpringBoot 应用日志。

踩坑记录:根分区 Docker 日志暴涨 42G 触发 ES 磁盘洪水只读锁、ES 单节点 yellow 分片告警、版本不兼容、内网 TCP 日志采集不通等问题,完整记录从 0 到日志可视化全流程,同时补充SpringBoot 集群接入ELK 三节点集群生产拓展方案,后续复用直接复制配置即可。

环境版本统一(避免版本报错)

  • Elasticsearch:7.17.14
  • Kibana:7.17.14
  • Logstash:7.17.14
  • SpringBoot:2.7.x/ 3.x 通用
  • 部署方式:Docker Compose

一、单机 ELK 部署(内网 Demo 可用,本次实操完整版)

1.1 服务器目录结构(192.168.1.140)

plaintext

/home/tlrobot/elk ├── docker-compose.yml # ELK编排文件 ├── elasticsearch/ │ ├── plugins # ES插件挂载目录 │ └── data # ES持久化数据目录 ├── kibana/config/ │ └── kibana.yml # Kibana配置 └── logstash/ └── logstash.conf # 日志采集输出规则

1.2 docker-compose.yml 完整配置(修复所有报错版本)

version: '3.8' networks: my-network: services: elasticsearch: image: elasticsearch:7.17.14 ports: - '19200:9200' - '19300:9300' container_name: elasticsearch restart: always environment: - "cluster.name=docker-cluster" - 'discovery.type=single-node' - 'ES_JAVA_OPTS=-Xms512m -Xmx512m' # 单节点关闭副本,消除yellow分片告警 - index.number_of_replicas=0 # 调低磁盘洪水水位,提前预警 - cluster.routing.allocation.disk.watermark.low=85% - cluster.routing.allocation.disk.watermark.high=90% - cluster.routing.allocation.disk.watermark.flood_stage=92% volumes: - ./elasticsearch/plugins:/usr/share/elasticsearch/plugins - ./elasticsearch/data:/usr/share/elasticsearch/data networks: - my-network kibana: image: kibana:7.17.14 container_name: kibana restart: always volumes: - /etc/localtime:/etc/localtime - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml ports: - '5601:5601' links: - elasticsearch:es environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 - elasticsearch.hosts=http://es:9200 - I18N_LOCALE=zh-CN networks: - my-network depends_on: - elasticsearch logstash: image: logstash:7.17.14 container_name: logstash restart: always volumes: - /etc/localtime:/etc/localtime - ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf ports: - '4560:4560' - '50000:50000/tcp' - '50000:50000/udp' - '9600:9600' environment: LS_JAVA_OPTS: -Xms512m -Xmx512m TZ: Asia/Shanghai MONITORING_ENABLED: false links: - elasticsearch:es networks: - my-network depends_on: - elasticsearch

1.3 Logstash 采集配置 logstash/logstash.conf

监听 4560 端口 TCP JSON 日志,按天分索引存储

input { tcp { mode => "server" host => "0.0.0.0" port => 4560 codec => json_lines type => "info" } } filter {} output { elasticsearch { action => "index" hosts => "es:9200" index => "springboot-demo-log-%{+YYYY.MM.dd}" } }

1.4 服务器初始化 & 启动命令

1)创建目录并授权(ES 数据目录必须 777,启动报错根源)

mkdir -p elasticsearch/plugins elasticsearch/data kibana/config logstash chmod 777 elasticsearch/data

2)防火墙放行内网端口

firewall-cmd --add-port=4560/tcp --permanent firewall-cmd --add-port=19200/tcp --permanent firewall-cmd --add-port=5601/tcp --permanent firewall-cmd --reload

3)启动 ELK

docker compose up -d # 查看启动状态 docker ps

启动成功截图:

1.5 踩坑 1:磁盘爆满触发 ES 429 洪水只读锁报错

报错日志:

disk usage exceeded flood-stage watermark, index has read-only-allow-delete block
根因

Docker 默认存储在根分区 /,容器日志暴涨 42G 占满磁盘,ES 自动上锁拒绝写入。

解决方案
  1. 清空超大容器日志(不删除镜像、容器)
# 截断42G日志文件,瞬间释放42G空间 truncate -s 0 /var/lib/docker/containers/xxx/json.log
  1. 解锁 ES 只读锁
curl -XPUT -H "Content-Type: application/json" http://127.0.0.1:19200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
  1. 长期根治:Docker 全局限制日志大小,避免日志暴涨
vim /etc/docker/daemon.json
{ "log-driver": "json-file", "log-opts": { "max-size": "500m", "max-file": "3" } }
systemctl restart docker

二、SpringBoot 应用接入 ELK(单机 / 集群通用)

2.1 Maven 依赖 pom.xml

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Logstash JSON日志编码器 --> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.0.1</version> </dependency> </dependencies>

2.2 日志配置 resources/logback-spring.xml

内网 Logstash 地址:192.168.1.140:4560

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> <!-- TCP输出到内网Logstash --> <appender name="LOGSTASH_TCP" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>192.168.1.140:4560</destination> <reconnectionDelay>3000</reconnectionDelay> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <includeMdcKeyName>appName</includeMdcKeyName> </encoder> </appender> <root level="info"> <appender-ref ref="CONSOLE"/> <appender-ref ref="LOGSTASH_TCP"/> </root> </configuration>

2.3 应用配置 application.yml

spring: application: name: elk-springboot-demo

2.4 测试日志 Controller

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LogTestController { private static final Logger log = LoggerFactory.getLogger(LogTestController.class); @GetMapping("/demo/log") public String printLog() { log.info("测试普通日志,参数={}", 666); log.warn("警告日志测试"); log.error("异常日志测试", new Exception("demo模拟报错")); return "日志发送完成,请访问Kibana查看"; } }

2.5 验证链路

  1. 本地启动 SpringBoot,访问http://localhost:8080/demo/log
  2. Kibana 索引管理页面查看自动生成日志索引

三、Kibana 可视化查看日志完整操作

3.1 创建索引模式

左侧菜单栏「Kibana」→「索引模式」→ 创建索引模式,匹配规则填写:

springboot-demo-log-*

时间字段选择@timestamp完成创建。

3.2 Discover 日志检索页面(最终效果图)

点击左上角汉堡菜单,展开主菜单→「数据」→「Discover」,即可查看所有采集日志,支持过滤、检索、查看异常堆栈。

常用检索语法

  1. 只查看错误日志:level: ERROR
  2. 检索包含指定关键词日志:message: 测试异常
  3. 筛选当前服务日志:appName: elk-springboot-demo

四、拓展 1:SpringBoot 集群接入 ELK 高可用方案

4.1 多台 Logstash 做故障转移

内网部署 2 台 Logstash 服务器:

  • 192.168.1.140
  • 192.168.1.141 修改 logback 的 destination,多地址逗号分隔,自动故障转移:
<destination>192.168.1.140:4560,192.168.1.141:4560</destination>

4.2 多应用集群区分日志

每个微服务配置独立spring.application.name,Kibana 通过appName字段筛选不同服务日志。

4.3 生产优化:新增 Redis/Kafka 缓冲

高并发场景建议在 SpringBoot 和 Logstash 中间增加 Kafka,避免 Logstash 宕机丢失日志。


五、拓展 2:ELK 三节点集群部署方案(生产容灾)

5.1 ES 集群核心改动

  1. 删除discovery.type=single-node单节点配置
  2. 开启副本分片index.number_of_replicas=1,集群状态变为 Green
  3. 配置集群节点发现、主节点选举
  4. 三个 ES 容器独立端口、独立数据卷

Logstash 输出多 ES 节点(负载均衡)

output { elasticsearch { hosts => ["es-node1:9200","es-node2:9200","es-node3:9200"] index => "springboot-demo-log-%{+YYYY.MM.dd}" load_balancing => true } }

5.2 Kibana 集群配置

连接多个 ES 节点,防止单 ES 节点宕机无法访问日志

environment: elasticsearch.hosts: ["http://es-node1:9200","http://es-node2:9200"]

5.3 单机 vs 集群核心差异对比

维度单机 ELK(Demo)三节点 ELK 集群(生产)
分片状态yellow(副本 1)/green(副本 0)Green,分片有副本容灾
数据安全单磁盘故障日志全部丢失分片多副本,单节点宕机不丢日志
并发能力单 ES 节点性能有限分片分散多节点,支持高并发写入
部署复杂度极简,单 compose 文件多节点编排,需配置集群发现
SpringBoot 配置单 Logstash 地址多 Logstash 地址故障转移

六、总结 & 复用指南

  1. Demo 快速搭建:直接复制第一章节单机 docker-compose,执行初始化命令即可一键启动 ELK;
  2. 日志采集链路:SpringBoot TCP 输出 JSON → Logstash 4560 端口接收 → ES 按天分索引 → Kibana 可视化检索;
  3. 核心踩坑点:根分区 Docker 日志爆满、ES 数据目录权限不足、ELK 版本不一致、单节点 yellow 分片;
  4. 生产拓展:多 Logstash 高可用、ES 三节点集群、Kafka 缓冲削峰。
http://www.jsqmd.com/news/999749/

相关文章:

  • MPC5200B嵌入式处理器:架构解析、BestComm DMA实战与系统设计指南
  • 别再死记硬背Conv1d参数了!用PyTorch实战NLP情感分析,手把手带你理解输入输出维度
  • STM32F103 MODBUS RTU从机固件包,带RS485驱动与威纶通HMI通信支持
  • 用STM32F031和HC-14无线模块,我手搓了一个三轮全向底盘遥控小车(附完整代码)
  • NYC Airbnb数据EDA实战:从清洗到业务洞察的完整工作流
  • 深度解析:马拉松电机,一篇读懂工业高效电机的核心原理与应用场景 - 速递信息
  • 2026钢筋混凝土检查井行业供应商适配指南 - 资讯快报
  • Chrome缓存文件直接查看与导出工具(附中文操作指南)
  • MPC8313E-RDB嵌入式平台:低成本网络与工业控制开发实战解析
  • 如何快速部署i茅台智能预约系统:5步实现自动化抢单的完整指南
  • 深入解析MCF5271:ColdFire V2核心、以太网与加密加速的嵌入式SoC设计
  • 多维度核查经营资质与施工质量 盘点保山十家长期稳定经营的口碑装企 - 装修新知
  • 告别手忙脚乱!D3keyHelper:暗黑3玩家的智能战斗管家
  • 3个核心功能,让原神玩家告别数据管理烦恼:Snap Hutao开源工具箱深度解析
  • 2026咨询废品回收上门公司必看的3个标准 - 速递信息
  • 汽车电子设计革新:S12ZVL混合信号MCU如何实现单芯片LIN节点方案
  • 串扰与EMI抑制:依托线宽优化电磁兼容性能
  • 如何在Windows上完美运行日文游戏:Locale-Emulator完全指南
  • 解密QRazyBox:从像素残骸到数据重建的二维码修复技术探案
  • 多模态推荐系统中的个性化参数高效微调技术
  • PvZWidescreen完整指南:3步告别黑边,让《植物大战僵尸》完美适配现代宽屏
  • MATLAB风应力及旋度计算工具:输入UV风场直接输出Pa/m单位旋度场
  • 2024杭州物流公司哪家好?靠谱企业对比指南 - 资讯快报
  • 【2026年6月】儿童雨衣厂家推荐指南 - 多才菠萝
  • 2026国内 GEO 代理服务商选型指南:源头厂商、合作权益与长期收益怎么判断? - 企业新闻快传
  • 软件测试入门——第十六课(常用字段类型与核心函数详解)
  • 如何在Windows 10系统上彻底解决PL-2303停产芯片驱动兼容性问题:终极技术指南
  • 基于i.MX RT106F跨界MCU的离线人脸识别方案全解析
  • 深入解析PowerPC MPC603e寄存器模型与底层编程实战
  • 上海哪里回收 DR 钻戒靠谱?本地五大合规机构实测 - 开心测评