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

【实战】使用 ELK 搭建 Spring Boot Docker 容器日志监控系统

@【TOC】

使用 ELK 搭建 Spring Boot Docker 容器日志监控系统

ELK (Elasticsearch + Logstash + Kibana) 是一套完整的日志收集、存储和可视化解决方案。下面详细介绍如何在 Docker 环境中为 Spring Boot 应用搭建 ELK 日志系统。

一、系统架构

Spring Boot App (Docker) → Logstash → Elasticsearch → Kibana (可视化)

二、详细搭建步骤

1. 准备 Spring Boot 应用

1.1 修改日志输出格式

application.propertiesapplication.yml 中配置 JSON 格式日志输出:

# 使用 JSON 格式输出日志,便于 Logstash 解析
logging.pattern.console={"@timestamp":"%d{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","service":"${spring.application.name}","pid":"%pid","thread":"%thread","class":"%logger{40}","message":"%message","stack_trace":"%exception{10}"}%n
1.2 创建 Dockerfile
FROM openjdk:17-jdk-slim
VOLUME /tmp
COPY target/your-app.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

2. 配置 ELK 环境

2.1 创建 docker-compose.yml
version: '3.8'services:# Elasticsearch 服务 netstat -tulnp | grep -E ':(9200|5002|5601)\s'elasticsearch:restart: alwayscontainer_name: elasticsearchimage: docker.elastic.co/elasticsearch/elasticsearch:8.7.0environment:- discovery.type=single-node- xpack.security.enabled=false- ES_JAVA_OPTS=-Xms1g -Xmx1gports:- "9200:9200"volumes:- ./elasticsearch/data:/usr/share/elasticsearch/datadeploy:resources:limits:cpus: '1'  # 限制最多使用 1 个 CPU 核心memory: 10G  # 限制内存为 10G# Logstash 服务logstash:restart: alwayscontainer_name: logstashimage: docker.elastic.co/logstash/logstash:8.7.0volumes:- ./logstash-config:/usr/share/logstash/pipeline/ports:- "5002:5000"environment:- LS_JAVA_OPTS=-Xms512m -Xmx512mdepends_on:- elasticsearchdeploy:resources:limits:cpus: '0.5'  # 限制最多使用 0.5 个 CPU 核心memory: 4G  # 限制内存为 4G# Kibana 服务kibana:restart: alwayscontainer_name: kibanaimage: docker.elastic.co/kibana/kibana:8.7.0ports:- "5601:5601"depends_on:- elasticsearchdeploy:resources:limits:cpus: '0.5'  # 限制最多使用 0.5 个 CPU 核心memory: 4G  # 限制内存为 4Gnetworks:default:external:name:  networkname # 需要自己新建一个 network
2.2 创建 Logstash 配置文件

在项目根目录创建 logstash-config 文件夹,然后创建 logstash.conf

input {tcp {port => 5000codec => json_lines}
}filter {# 如果日志中有堆栈跟踪信息,进行特殊处理if [stack_trace] {mutate {gsub => ["stack_trace", "\n", "\\n","stack_trace", "\t", "\\t"]}}
}output {elasticsearch {hosts => ["elasticsearch:9200"]index => "spring-logs-%{+YYYY.MM.dd}"}# 可选:同时输出到控制台便于调试stdout {codec => rubydebug}
}
2.3 修改 Spring Boot 日志输出到 Logstash

logback-spring.xml 中添加 Logstash 输出:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><include resource="org/springframework/boot/logging/logback/defaults.xml"/><springProperty scope="context" name="appName" source="spring.application.name"/><appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>logstash:5000</destination><encoder class="net.logstash.logback.encoder.LogstashEncoder"/></appender><root level="INFO"><appender-ref ref="LOGSTASH"/></root>
</configuration>

3. 构建并启动服务

3.1 构建 Spring Boot 应用镜像
mvn clean package
docker-compose build app
3.2 启动所有服务
docker-compose up -d

4. 配置 Kibana

  1. 访问 Kibana: http://localhost:5601
  2. 首次访问可能需要配置默认索引模式:
    • 进入 “Management” → “Stack Management”
    • 选择 “Index Patterns” → “Create index pattern”
    • 输入 spring-logs-* 作为模式
    • 选择 @timestamp 作为时间字段
    • 点击 “Create index pattern”

5. 查看日志

  1. 进入 Kibana 的 “Discover” 页面
  2. 选择 spring-logs-* 索引模式
  3. 可以看到所有收集到的 Spring Boot 日志

三、高级配置

1. 日志数据保留策略

在 Elasticsearch 中配置 ILM (Index Lifecycle Management) 自动管理日志索引:

# 修改 logstash.conf 的 output 部分
output {elasticsearch {hosts => ["elasticsearch:9200"]index => "spring-logs-%{+YYYY.MM.dd}"ilm_enabled => trueilm_policy => "spring-logs-policy"}
}

然后在 Kibana 中创建 ILM 策略:

  1. 进入 “Management” → “Stack Management” → “Index Lifecycle Policies”
  2. 创建名为 spring-logs-policy 的策略
  3. 设置热阶段 7 天,删除阶段 30 天

2. 添加日志字段过滤

在 Logstash 配置中添加更多过滤规则:

filter {# 解析 JSON 消息if [message] {json {source => "message"target => "message_json"}}# 添加 Docker 容器信息mutate {add_field => {"[docker][container_id]" => "%{host}""[docker][container_name]" => "%{container_name}"}}
}

3. 安全配置

为 ELK 添加基础认证:

  1. 修改 docker-compose.yml 中 Elasticsearch 的环境变量:
environment:- discovery.type=single-node- xpack.security.enabled=true- ELASTIC_PASSWORD=yourpassword
  1. 更新 Logstash 配置:
output {elasticsearch {hosts => ["elasticsearch:9200"]user => "elastic"password => "yourpassword"index => "spring-logs-%{+YYYY.MM.dd}"}
}

四、故障排查

  1. Logstash 无法连接 Elasticsearch:

    • 检查网络是否联通: docker-compose exec logstash curl elasticsearch:9200
    • 查看 Logstash 日志: docker-compose logs logstash
  2. Kibana 无法显示数据:

    • 检查索引是否存在: curl http://localhost:9200/_cat/indices?v
    • 确认数据正在流入: curl http://localhost:9200/spring-logs-*/_count
  3. 日志量过大导致性能问题:

    • 增加 Elasticsearch 堆内存
    • 调整 Logstash 的批量写入参数
    • 考虑使用 Filebeat 替代 Logstash 的直接 TCP 输入

五、生产环境建议

  1. 使用 Filebeat 替代直接 TCP 输入:

    • Filebeat 更轻量级,资源消耗更少
    • 支持断点续传,更可靠
  2. 多节点 Elasticsearch 集群:

    • 至少 3 个节点保证高可用
    • 配置专用主节点和数据节点
  3. 监控 ELK 自身健康状态:

    • 使用 Elasticsearch 的监控功能
    • 设置告警规则

通过以上步骤,您已经成功搭建了一个完整的 ELK 日志监控系统,可以实时查看和分析 Spring Boot 应用的日志数据。

http://www.dtcms.com/a/272253.html

相关文章:

  • OSPF实验以及核心原理全解
  • 【SkyWalking】配置告警规则并通过 Webhook 推送钉钉通知
  • HP EVA SAN 数据恢复利器:Data recovery plugin for HP StorageWorks EVA
  • 前端项目集成husky + lint-staged + commitlint
  • Web-Bench:基于web标准和框架的benchmark
  • Fiddler中文版全面评测:功能亮点、使用场景与中文网资源整合指南
  • 什么是强化学习(RL)--2
  • 如何在VMware里的飞牛OS访问主机里面图片文件夹
  • 【运维实战】解决 K8s 节点无法拉取 pause:3.6 镜像导致 API Server 启动失败的问题
  • 【EGSR2025】材质+扩散模型+神经网络相关论文整理随笔(三)
  • 华为昇腾NPU与NVIDIA CUDA生态兼容层开发实录:手写算子自动转换工具链(AST级代码迁移方案)
  • 缓存穿透与击穿多方案对比与实践指南
  • 设计模式的六大设计原则
  • AI问答之手机相机专业拍照模式的主要几个参数解释
  • 【笔记】使用 html 创建网址快捷方式
  • 达梦数据库DMDRS搭建单向dm8-dm8数据同步
  • 【工具教程】批量提取OCR图片中固定文字保存WPS表格,批量OCR识别图像中的文字保存到Excel表格的操作步骤和注意事项
  • 虚拟环境已安装该包,且已激活,但报错
  • 智能体的记忆系统:短期记忆、长期记忆与知识图谱
  • Spring for Apache Pulsar->Reactive Support->Quick Tour
  • 【LeetCode100】--- 1.两数之和【复习回滚】
  • 氢能源杂谈
  • 深入拆解Spring核心思想之一:IoC
  • 天津医大用网络药理学+分子对接发表中科院二区IF5
  • 【Python】基于Python提取图片验证码
  • SYM32第二十天 ESP8266-01S和电脑实现串口通信(3)
  • 羊肚菌自动采收车设计cad【7张】+三维图+设计说明书
  • 电脑息屏工具,一键黑屏超方便
  • 双esp8266-01之间UDP透传传输,自定义协议
  • LlamaFactory Demo