本文将带你从零搭建 Loki 日志系统,通过 Promtail 采集 Docker 容器日志,并使用 Grafana 进行可视化展示与搜索。
一、前言
在微服务架构中,日志是定位问题的关键。传统的 ELK(Elasticsearch + Logstash + Kibana)方案功能强大,但资源消耗高、配置复杂。
Grafana Labs 推出的 Loki 是一个轻量级、成本低的日志系统,灵感来自 Prometheus,天然支持容器化和云原生场景。
本篇将带你实现:
- ✅ 自动采集所有 Docker 容器日志
- ✅ 使用 Grafana 可视化日志
- ✅ 支持多容器筛选与关键字搜索
- ✅ 可拓展日志告警与监控体系
二、系统架构
整体架构如下:

- Promtail:采集容器日志并推送给 Loki
- Loki:存储和索引日志数据
- Grafana:展示与分析日志
三、环境准备
本文基于 Docker Compose 部署,环境如下:
| 项目 | 版本 |
|---|---|
| 操作系统 | Ubuntu / Windows / macOS |
| Docker | ≥ 24.0 |
| Grafana | latest |
| Loki | 2.9.0 |
| Promtail | 2.9.0 |
/docker-logging
├── grafana/
├── promtail/
│ └── promtail-config.yml
└── docker-compose.yml
docker-compose.yml 这里只提供文件部分内容请注意辨别
yaml
services:
loki:
image: grafana/loki:2.9.0
container_name: loki
networks:
- my-network
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:2.9.0
container_name: promtail
networks:
- my-network
volumes:
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock
- /root/monitoring-project/promtail-config.yml:/etc/promtail/config.yml:ro
depends_on:
- loki
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
networks:
- my-network
ports:
- "3000:3000"
volumes:
- /root/monitoring-project/grafana/provisioning:/etc/grafana/provisioning
- /root/monitoring-project/grafana/data:/var/lib/grafana
promtail-config.yml
yaml
server:
http_listen_port: 0
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker-logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 10s
relabel_configs:
# 给每条日志加 container 标签
- source_labels: [__meta_docker_container_name]
regex: '(?:/)?(.*)'
target_label: container
# 添加 job 标签
- target_label: job
replacement: docker-logs
四、开始执行
前面的环境与配置都准备好之后,就可以运行熟悉的命令来启动整个日志系统了:
bash
docker compose up -d
等待所有容器启动完成后,就可以开始查看相关的日志信息。
⚠️ 注意事项
Promtail 默认会尝试抓取它所能访问到的所有容器日志,并将其推送到 Loki。
因此,在启动初期,你可能会在 Promtail 的日志中看到一些 推送失败(push error) 的提示,这是正常现象。
原因在于 Loki 只接收一定时间范围内的最新日志,旧日志数据会被丢弃或忽略。
当所有容器都正常运行后,就可以开始在 Grafana 中配置 Loki 数据源了。
如果你是第一次使用 Grafana,它默认运行在端口 3000,可通过以下地址访问
bash
http://<你的服务器IP或域名>:3000
默认的登录账号和密码均为:
bash
admin / admin
登录 Grafana 后,在首页依次点击:
Connections -> Add new data source -> Loki
在配置页面中,将 URL 设置为:
其余选项保持默认即可。点击页面底部的 "Save & Test" 按钮,如果显示连接成功,说明数据源配置完成 ✅。
现在,你可以进入左侧菜单的 Explore 页面,在数据源中选择 Loki,开始实时查看和搜索你的 Docker 日志了!

五、Grafana 日志探索与查询
当 Loki 数据源配置完成后,就可以在 Grafana 中开始探索日志数据了。
点击左侧导航栏的 "Explore" 图标(放大镜样式 🔍),在顶部的数据源选择框中选择 Loki。
Grafana 会自动显示一个日志查询输入框,你可以在这里使用 Loki 的查询语言 LogQL 来筛选和分析容器日志。

1️⃣ 基础查询
示例一:查看指定容器日志
{container="nginx"}
这条语句会展示名为 nginx 的容器的实时日志。
如果 Promtail 成功采集了多个容器的日志,你可以在标签选择器中快速选择其他容器。
示例二:按关键字过滤日志
{container="nginx"} |= "error"
|= 表示日志中包含指定字符串,这里会筛选出所有包含 "error" 的日志行。
示例三:使用正则匹配日志
{container="spring-app"} |~ "INFO|WARN|ERROR"
|~ 表示正则匹配,适合过滤不同级别的日志。
2️⃣ 时间范围与实时模式
Grafana 默认展示最近 1 小时的日志。
你可以通过右上角的时间选择器修改时间范围,例如查看过去 24 小时或最近 15 分钟的日志。
如果想实时查看日志,可以点击右上角的 "Live" 按钮,Grafana 将进入实时模式,像 tail -f 一样自动刷新日志,非常适合调试。
3️⃣ 多标签组合查询
在 LogQL 中可以同时使用多个标签进行筛选:
{container="nginx", stream="stderr"} |= "timeout"
这表示只查看 nginx 容器中标准错误流(stderr)里包含 "timeout" 的日志。
这种组合查询方式非常适合快速定位问题。
4️⃣ 日志统计与趋势分析
Loki 不仅能展示原始日志,还支持对日志数量进行统计。
例如:
count_over_time({container="nginx"}[5m])
上面的语句表示统计最近 5 分钟内 nginx 容器的日志条数,可用于绘制趋势图。
结合 Grafana 的可视化功能,你可以轻松构建出日志量变化趋势、错误率曲线等图表。
5️⃣ 保存查询与仪表盘可视化
当你调试出一条有用的查询语句后,可以点击右上角的 "Save as Panel",将查询结果保存到仪表盘中。
这样下次无需重新输入查询条件,方便团队成员共享使用。
💡 建议你为不同服务或日志类型建立独立的 Dashboard,例如:
系统日志监控面板
错误日志趋势图
容器运行日志实时视图
6️⃣ 示例:快速构建一个日志监控面板
打开 Dashboard → New Dashboard → Add a new panel
选择数据源:Loki
输入查询语句:
count_over_time({container="spring-app"} |= "ERROR"[1m])
可视化类型选择 Graph (Time series)
点击 Apply 保存
此时,你就能看到系统每分钟内的错误日志数量曲线。
如果你配合 Grafana 的告警功能,还可以在错误日志数量异常时触发通知。
六、结语
从容器日志的采集、传输到可视化展示,我们完整地搭建了一套 Loki + Promtail + Grafana 的日志监控体系。
这套方案轻量、高效、可扩展,非常适合用于 Docker 容器环境 或 微服务架构 的日志统一管理。
在实际落地过程中,你会发现:
- Promtail 负责日志的收集与标签提取;
- Loki 承担日志存储与检索;
- Grafana 则是整个系统的"可视化大脑"。
通过它们的配合,我们不仅能集中查看所有容器日志,还能:
- 快速定位线上问题;
- 分析系统运行趋势;
- 构建多维监控面板;
- 实现基于日志的自动化告警。
未来,你还可以在此基础上进一步扩展:
- 使用 Alertmanager 实现日志告警;
- 利用 LogQL 聚合语法 做更复杂的分析;
- 引入 结构化日志(JSON 格式) 提升查询体验;
- 将系统接入 Kubernetes 环境,实现集群级日志观测。
💡 一句话总结:
Loki + Promtail + Grafana 的组合,不仅是一套日志解决方案,更是让我们重新认识系统运行状态、快速发现问题的"观察者之眼"。
感谢阅读!如果这篇文章对你有帮助,欢迎点赞、收藏或分享给更多正在搭建日志系统的朋友。🚀