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

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 三节点集群生产拓展方案后续复用直接复制配置即可。环境版本统一避免版本报错Elasticsearch7.17.14Kibana7.17.14Logstash7.17.14SpringBoot2.7.x/ 3.x 通用部署方式Docker Compose一、单机 ELK 部署内网 Demo 可用本次实操完整版1.1 服务器目录结构192.168.1.140plaintext/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.namedocker-cluster - discovery.typesingle-node - ES_JAVA_OPTS-Xms512m -Xmx512m # 单节点关闭副本消除yellow分片告警 - index.number_of_replicas0 # 调低磁盘洪水水位提前预警 - cluster.routing.allocation.disk.watermark.low85% - cluster.routing.allocation.disk.watermark.high90% - cluster.routing.allocation.disk.watermark.flood_stage92% 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_URLhttp://elasticsearch:9200 - elasticsearch.hostshttp://es:9200 - I18N_LOCALEzh-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: - elasticsearch1.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/data2防火墙放行内网端口firewall-cmd --add-port4560/tcp --permanent firewall-cmd --add-port19200/tcp --permanent firewall-cmd --add-port5601/tcp --permanent firewall-cmd --reload3启动 ELKdocker 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 自动上锁拒绝写入。解决方案清空超大容器日志不删除镜像、容器# 截断42G日志文件瞬间释放42G空间 truncate -s 0 /var/lib/docker/containers/xxx/json.log解锁 ES 只读锁curl -XPUT -H Content-Type: application/json http://127.0.0.1:19200/_all/_settings -d {index.blocks.read_only_allow_delete: null}长期根治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.xmldependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Logstash JSON日志编码器 -- dependency groupIdnet.logstash.logback/groupId artifactIdlogstash-logback-encoder/artifactId version7.0.1/version /dependency /dependencies2.2 日志配置 resources/logback-spring.xml内网 Logstash 地址192.168.1.140:4560?xml version1.0 encodingUTF-8? configuration scantrue include resourceorg/springframework/boot/logging/logback/defaults.xml/ include resourceorg/springframework/boot/logging/logback/console-appender.xml/ !-- TCP输出到内网Logstash -- appender nameLOGSTASH_TCP classnet.logstash.logback.appender.LogstashTcpSocketAppender destination192.168.1.140:4560/destination reconnectionDelay3000/reconnectionDelay encoder classnet.logstash.logback.encoder.LogstashEncoder includeMdcKeyNameappName/includeMdcKeyName /encoder /appender root levelinfo appender-ref refCONSOLE/ appender-ref refLOGSTASH_TCP/ /root /configuration2.3 应用配置 application.ymlspring: application: name: elk-springboot-demo2.4 测试日志 Controllerimport 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 验证链路本地启动 SpringBoot访问http://localhost:8080/demo/logKibana 索引管理页面查看自动生成日志索引三、Kibana 可视化查看日志完整操作3.1 创建索引模式左侧菜单栏「Kibana」→「索引模式」→ 创建索引模式匹配规则填写springboot-demo-log-*时间字段选择timestamp完成创建。3.2 Discover 日志检索页面最终效果图点击左上角汉堡菜单展开主菜单→「数据」→「Discover」即可查看所有采集日志支持过滤、检索、查看异常堆栈。常用检索语法只查看错误日志level: ERROR检索包含指定关键词日志message: 测试异常筛选当前服务日志appName: elk-springboot-demo四、拓展 1SpringBoot 集群接入 ELK 高可用方案4.1 多台 Logstash 做故障转移内网部署 2 台 Logstash 服务器192.168.1.140192.168.1.141 修改 logback 的 destination多地址逗号分隔自动故障转移destination192.168.1.140:4560,192.168.1.141:4560/destination4.2 多应用集群区分日志每个微服务配置独立spring.application.nameKibana 通过appName字段筛选不同服务日志。4.3 生产优化新增 Redis/Kafka 缓冲高并发场景建议在 SpringBoot 和 Logstash 中间增加 Kafka避免 Logstash 宕机丢失日志。五、拓展 2ELK 三节点集群部署方案生产容灾5.1 ES 集群核心改动删除discovery.typesingle-node单节点配置开启副本分片index.number_of_replicas1集群状态变为 Green配置集群节点发现、主节点选举三个 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 集群核心差异对比维度单机 ELKDemo三节点 ELK 集群生产分片状态yellow副本 1/green副本 0Green分片有副本容灾数据安全单磁盘故障日志全部丢失分片多副本单节点宕机不丢日志并发能力单 ES 节点性能有限分片分散多节点支持高并发写入部署复杂度极简单 compose 文件多节点编排需配置集群发现SpringBoot 配置单 Logstash 地址多 Logstash 地址故障转移六、总结 复用指南Demo 快速搭建直接复制第一章节单机 docker-compose执行初始化命令即可一键启动 ELK日志采集链路SpringBoot TCP 输出 JSON → Logstash 4560 端口接收 → ES 按天分索引 → Kibana 可视化检索核心踩坑点根分区 Docker 日志爆满、ES 数据目录权限不足、ELK 版本不一致、单节点 yellow 分片生产拓展多 Logstash 高可用、ES 三节点集群、Kafka 缓冲削峰。