Spring Boot 集成 ELK 实现日志收集与搜索
ELK 是 Elasticsearch、Logstash 和 Kibana 的简称,是当下非常流行的日志管理与搜索解决方案。本文将从零开始,带你搭建一个简单的 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 配置
- 打开 http://localhost:5601
- 进入 Management → Stack Management → Index Patterns
- 新建索引模式 springboot-logs-*
- 时间字段选择 @timestamp
- 进入 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)