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

【spring boot】三种日志系统对比:ELK、Loki+Grafana、Docker API

文章目录

    • **方案 1:使用 ELK(Elasticsearch + Logstash + Kibana)**
      • **适用场景**
      • **搭建步骤**
        • **1. 修改 Spring Boot 日志输出**
        • **2. 创建 Docker Compose 文件**
        • **3. 配置 Logstash**
        • **4. 启动服务**
    • **方案 2:使用 Loki + Grafana**
      • **适用场景**
      • **搭建步骤**
        • **1. 修改 Spring Boot 日志驱动**
        • **2. 配置 Grafana 数据源**
        • **3. 查看日志**
    • **方案 3:直接通过 Docker 日志 API + WebSocket 实时推送**
      • **适用场景**
      • **搭建步骤**
        • **1. 创建 Spring Boot 日志接口**
        • **2. 前端页面**
        • **3. 访问日志页面**
    • **方案对比**
    • **推荐选择**

在 Spring Boot 项目运行于 Docker 容器时,若需要在页面上查看实时控制台日志,可通过以下几种方案实现。以下是每种方案的详细搭建步骤:


方案 1:使用 ELK(Elasticsearch + Logstash + Kibana)

适用场景

  • 需要集中式日志管理、搜索和分析能力。
  • 适合生产环境,支持多节点日志聚合。

搭建步骤

1. 修改 Spring Boot 日志输出

确保应用日志输出为 JSON 格式(便于 Logstash 解析):

# application.properties
logging.pattern.console={"time":"%d{yyyy-MM-dd HH:mm:ss.SSS}","level":"%level","service":"${spring.application.name}","thread":"%thread","message":"%msg"}%n
2. 创建 Docker Compose 文件

docker-compose-elk.yml

version: '3'
services:spring-boot-app:image: your-spring-boot-app:latestenvironment:- SPRING_PROFILES_ACTIVE=dockerports:- "8080:8080"logging:driver: "json-file"options:max-size: "10m"max-file: "3"elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.7.0environment:- discovery.type=single-node- xpack.security.enabled=falseports:- "9200:9200"volumes:- es_data:/usr/share/elasticsearch/datalogstash:image: docker.elastic.co/logstash/logstash:8.7.0ports:- "5000:5000"volumes:- ./logstash.conf:/usr/share/logstash/pipeline/logstash.confdepends_on:- elasticsearchkibana:image: docker.elastic.co/kibana/kibana:8.7.0ports:- "5601:5601"depends_on:- elasticsearchvolumes:es_data:
3. 配置 Logstash

创建 logstash.conf

input {tcp {port => 5000codec => json_lines}
}
output {elasticsearch {hosts => ["elasticsearch:9200"]index => "spring-logs-%{+YYYY.MM.dd}"}
}
4. 启动服务
docker-compose -f docker-compose-elk.yml up

访问 Kibana 查看日志:

http://localhost:5601

方案 2:使用 Loki + Grafana

适用场景

  • 轻量级日志收集,适合云原生环境。
  • 与 Prometheus 监控栈集成。

搭建步骤

1. 修改 Spring Boot 日志驱动

docker-compose.yml

version: '3'
services:spring-boot-app:image: your-spring-boot-app:latestlogging:driver: "loki"options:loki-url: "http://loki:3100/loki/api/v1/push"loki:image: grafana/loki:2.7.0ports:- "3100:3100"grafana:image: grafana/grafana:9.5.0ports:- "3000:3000"depends_on:- loki
2. 配置 Grafana 数据源
  1. 访问 http://localhost:3000,登录 Grafana(默认账号 admin/admin)。
  2. 添加 Loki 数据源:
    • URL: http://loki:3100
    • 保存后,在 Explore 页面查询日志。
3. 查看日志

在 Grafana 的 Explore 页面输入查询:

{container_name="spring-boot-app"}

方案 3:直接通过 Docker 日志 API + WebSocket 实时推送

适用场景

  • 简单场景,仅需实时查看单个容器日志。
  • 适合开发调试。

搭建步骤

1. 创建 Spring Boot 日志接口
@RestController
public class LogController {@GetMapping("/logs")public SseEmitter streamLogs() throws IOException {SseEmitter emitter = new SseEmitter();Process process = Runtime.getRuntime().exec("docker logs -f your-container-id");BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));new Thread(() -> {String line;try {while ((line = reader.readLine()) != null) {emitter.send(SseEmitter.event().data(line));}} catch (IOException e) {emitter.completeWithError(e);}}).start();return emitter;}
}
2. 前端页面
<!DOCTYPE html>
<html>
<body><pre id="logs"></pre><script>const eventSource = new EventSource("/logs");eventSource.onmessage = (e) => {document.getElementById("logs").innerHTML += e.data + "\n";};</script>
</body>
</html>
3. 访问日志页面
http://localhost:8080/logs-page

方案对比

方案适用场景复杂度实时性生产可用性
ELK生产环境,多节点✔️✔️
Loki+Grafana云原生,轻量级✔️✔️
Docker API开发调试,单容器✔️

推荐选择

  • 开发环境:直接使用 Docker API 或 docker logs -f
  • 生产环境:使用 ELK 或 Loki+Grafana,具体取决于基础设施复杂度。
http://www.xdnf.cn/news/15181.html

相关文章:

  • 长效住宅代理IP:反爬虫战场上的隐形盾牌
  • 代码随想录17|二叉树的层序遍历|翻转二叉树|对称二叉树
  • Java入门之JDK下载和安装
  • HTTP 错误 500.19 - 打开 IIS 网页时出现内部服务器错误
  • Windows Edge 播放 H.265 视频指南
  • 自动化测试策略设计和避坑概要
  • 图解Java数据容器(三):Queue
  • imx6ull-裸机学习实验16——I2C 实验
  • 【C++】第十四节—模版进阶(非类型模版参数+模板的特化+模版分离编译+模版总结)
  • Vue响应式原理五:响应式-自动收集依赖
  • 第七讲:C++中的string类
  • 分布式ID方案
  • 羊肚菌自动采收车设计cad【7张】+三维图+设计说明书
  • 什么?不知道 MyBatisPlus 多数据源(动态数据源)干什么的,怎么使用,看这篇文章就够了。
  • 目标检测中的评价指标计算
  • 从零搭建多商户商城系统源码:技术栈、数据库设计与接口规划详解
  • 好用研发项目管理软件对比:8Manage PM与飞书功能深度测评
  • 【网络安全】利用 Cookie Sandwich 窃取 HttpOnly Cookie
  • Canvas 状态管理 语法糖 canvas.withSave() {}
  • Houdini 分布式解算效率瓶颈突破:渲染 101 云集群实战指南
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_keepalive_probes
  • Docker 镜像加速站汇总与使用指南
  • GitHub上优秀的开源播放器项目介绍及优劣对比
  • iOS APP混合开发性能测试怎么做?页面卡顿、通信异常的工具组合实战
  • Apache Shiro 框架详解
  • K线连续涨跌统计与分析工具
  • 3D Surface Reconstruction with Enhanced High-Frequency Details
  • 快速上手MongoDB与.NET/C#整合
  • 大模型在膀胱癌诊疗全流程预测及应用研究报告
  • 大数据的安全挑战与应对