kibana本身不采集日志,仅可视化elasticsearch中的数据;完整链路为java应用→filebeat/logstash→elasticsearch→kibana,需确保docker网络互通、日志输出至stdout或可挂载路径、filebeat正确解析多行异常、kibana配置对应索引模式并选择@timestamp字段。

直接用 Docker 部署 Kibana 来可视化 Java 应用日志,本身不难,但关键在于日志要能“流到 Kibana”——Kibana 本身不采集日志,它只展示 Elasticsearch 中的数据。所以完整链路是:Java 应用 → 日志采集器(如 Filebeat / Logstash)→ Elasticsearch → Kibana。Docker 只是运行环境载体,重点是服务间通信和数据流向配置正确。
确保 Java 应用日志可被采集
Java 应用默认输出到控制台(stdout/stderr)或文件。推荐统一输出到 stdout(尤其在容器中),便于 Docker 日志驱动捕获;若写文件,需挂载卷并让 Filebeat 能读取。
- Spring Boot 项目可在 application.yml 中配置:
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
level:
root: info
- 避免使用异步日志框架(如 Log4j2 AsyncAppender)绕过 stdout,否则 Docker 日志不可见;
- 若必须写文件,确保日志路径在容器内可访问(例如 /app/logs/app.log),并在 docker run 时挂载对应宿主机目录。
用 Docker Compose 编排 ELK 栈(含 Kibana)
推荐用 docker-compose.yml 统一管理 Elasticsearch、Kibana 和采集器(以 Filebeat 为例),保证网络互通、版本兼容(建议都用 8.x 同版本)。
- Elasticsearch 需配置 discovery.type=single-node(开发环境),并开放 9200 端口;
- Kibana 需设置 ELASTICSEARCH_HOSTS=http://elasticsearch:9200(注意是容器名,非 localhost);
- Filebeat 容器要挂载 Java 应用日志路径(或 Docker 日志 socket),并配置 output 指向 elasticsearch 容器。
示例关键片段(docker-compose.yml):
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
kibana:
image: docker.elastic.co/kibana/kibana:8.12.2
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
filebeat:
image: docker.elastic.co/beats/filebeat:8.12.2
volumes:
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
配置 Filebeat 抓取 Java 容器日志
Filebeat 默认不自动识别 Java 日志格式,需在 filebeat.yml 中指定 multiline pattern 合并堆栈跟踪(否则一行异常分多条,无法关联)。
- 匹配 Spring Boot 的 ERROR 日志开头(含时间戳 + ERROR):
filebeat.inputs:
- type: docker
containers.ids:
- "*"
multiline.pattern: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3} .+ ERROR '
multiline.negate: true
multiline.match: after
- output 段指向 Elasticsearch,无需认证(开发环境可关 security);
- 启动后检查 Filebeat 日志:出现 "PublishEvents: events sent" 表示数据已发往 ES。
在 Kibana 中创建索引模式并查看日志
Kibana 启动后访问 http://localhost:5601,首次需配置索引模式(Index Pattern)才能查日志。
- 默认 Filebeat 写入的索引名类似 filebeat-8.12.2-2024.05.20,在 Kibana 的 Stack Management → Index Patterns 中输入 filebeat-* 创建;
- 选择 @timestamp 作为时间字段;
- 进入 Discover 页面,筛选 container.name : "your-java-app" 或 log.level : "ERROR" 快速定位问题;
- 可保存常用搜索、创建折线图(如每分钟 ERROR 数)、仪表板做实时监控。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











