醋醋百科网

Good Luck To You!

Spring Boot 集成 ELK 实现日志收集与搜索

Spring Boot 集成 ELK 实现日志收集与搜索

ELK 是 ElasticsearchLogstashKibana 的简称,是当下非常流行的日志管理与搜索解决方案。本文将从零开始,带你搭建一个简单的 Spring Boot + ELK 日志收集系统,并在 Kibana 中实现可视化搜索。


1. ELK 架构简介

核心组件

  • Elasticsearch
    分布式搜索与分析引擎,用于存储和索引日志数据
  • Logstash
    数据采集与处理管道,将日志数据解析、转换并发送到 Elasticsearch
  • Kibana
    可视化分析与搜索界面

系统架构图


2. 环境准备

使用 Docker 快速搭建 ELK 环境(建议 ELK 版本保持一致,例如 7.12.0):

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - "9200:9200"
    networks:
      - elk

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

  kibana:
    image: docker.elastic.co/kibana/kibana:7.12.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
      - elk

networks:
  elk:
    driver: bridge

3. Logstash 配置

logstash.conf:

input {
  tcp {
    port => 5000
    codec => json_lines
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "springboot-logs-%{+YYYY.MM.dd}"
  }
}

4. Spring Boot 配置

4.1 添加依赖

pom.xml:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version>
</dependency>

4.2 配置 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:5000</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    <root level="INFO">
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

5. 测试 Controller

@RestController
@Slf4j
public class LogController {

    @GetMapping("/log")
    public String logTest() {
        log.info("INFO log message from Spring Boot");
        log.warn("WARN log message from Spring Boot");
        log.error("ERROR log message from Spring Boot");
        return "Logs sent to ELK";
    }

    @GetMapping("/exception")
    public String exceptionTest() {
        try {
            throw new RuntimeException("Test exception");
        } catch (Exception e) {
            log.error("Exception occurred", e);
        }
        return "Exception log sent to ELK";
    }
}

6. Kibana 配置

  1. 打开 http://localhost:5601
  2. 进入 Management → Stack Management → Index Patterns
  3. 新建索引模式 springboot-logs-*
  4. 时间字段选择 @timestamp
  5. 进入 Discover 查看日志

7. 生产环境优化建议

  • 高可用部署:Elasticsearch 建议 3 节点以上,Logstash 多实例部署
  • 安全认证:开启 X-Pack 或使用 OpenSearch 提供安全层
  • 性能优化
    • 生产中建议用 Filebeat 从应用日志文件收集数据,避免应用直接写 TCP
    • 设置日志生命周期(ILM),定期归档或删除旧索引
    • 调整 Logstash pipeline 批量处理参数
  • 版本兼容性
    • Logstash 与 Elasticsearch 版本保持一致
    • logstash-logback-encoder 要与 Spring Boot 的 logback 版本兼容

8. 最终效果

  • 访问 http://localhost:8080/log
    → 在 Kibana 中可以实时看到 info、warn、error 日志
  • 访问 http://localhost:8080/exception
    → Kibana 中显示完整堆栈信息

完整的 ELK + Spring Boot 数据流图

ELK 日志收集流程说明:

流程详解:

1. 日志生成端:

- Spring Boot 应用通过 Logback 的 `LogstashTcpSocketAppender` 将 JSON 格式日志实时发送到 Logstash(端口 5000)

2. 日志处理管道:

- Logstash 接收日志后执行:

  • 解码 JSON 数据
  • 应用过滤器(如添加告警标记)
  • 附加主机/IP 等元数据
  • 通过批量 API 写入 Elasticsearch

3. 存储与检索:

- Elasticsearch 自动:

  • 创建 `springboot-logs-*` 日期索引
  • 建立倒排索引(支持全文搜索)
  • 压缩存储原始日志

4. 可视化分析:

- 支持功能:

  • 关键词搜索(如 `level:ERROR AND message:"test exception"`)
  • 字段聚合分析(统计错误级别分布)
  • 时间范围筛选(最近15分钟日志)

关键配置对比

组件

输入方式

输出方式

性能影响因子

Spring Boot

TCP Socket (异步)

JSON 编码

日志量级、网络延迟

Logstash

多线程队列(默认128条批量)

Bulk API(每次1000条)

pipeline 过滤器复杂度

ES

HTTP REST API

分片写入(默认1秒刷新)

索引副本数、硬件资源


生产环境增强建议

1. 可靠性提升:

  • 使用 Filebeat 替代直接 TCP 连接
  • 引入 Kafka 作为日志缓冲队列

2. 安全加固:

  • 启用 TLS 加密传输
  • 配置 Elasticsearch 角色权限控制

3. 性能优化:

  • Logstash 增加 `pipeline.workers` (CPU核数)
  • ES 设置合理的分片数(数据量/30GB)
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言