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

文章目录

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

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


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

适用场景

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

搭建步骤

1. 修改 Spring Boot 日志输出

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

properties 复制代码
# 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

yaml 复制代码
version: '3'
services:
  spring-boot-app:
    image: your-spring-boot-app:latest
    environment:
      - SPRING_PROFILES_ACTIVE=docker
    ports:
      - "8080:8080"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.7.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - "9200:9200"
    volumes:
      - es_data:/usr/share/elasticsearch/data

  logstash:
    image: docker.elastic.co/logstash/logstash:8.7.0
    ports:
      - "5000:5000"
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:8.7.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

volumes:
  es_data:
3. 配置 Logstash

创建 logstash.conf

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

访问 Kibana 查看日志:

复制代码
http://localhost:5601

方案 2:使用 Loki + Grafana

适用场景

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

搭建步骤

1. 修改 Spring Boot 日志驱动

docker-compose.yml

yaml 复制代码
version: '3'
services:
  spring-boot-app:
    image: your-spring-boot-app:latest
    logging:
      driver: "loki"
      options:
        loki-url: "http://loki:3100/loki/api/v1/push"

  loki:
    image: grafana/loki:2.7.0
    ports:
      - "3100:3100"

  grafana:
    image: grafana/grafana:9.5.0
    ports:
      - "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 日志接口
java 复制代码
@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. 前端页面
html 复制代码
<!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,具体取决于基础设施复杂度。
相关推荐
JH30734 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
qq_12498707537 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_7 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_818732067 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
汤姆yu11 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶11 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip12 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide12 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf13 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva13 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端