使用 Loki + Promtail + Grafana 实现 Docker 容器日志采集与可视化

本文将带你从零搭建 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 设置为:

http://loki:3100

其余选项保持默认即可。点击页面底部的 "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 的组合,不仅是一套日志解决方案,更是让我们重新认识系统运行状态、快速发现问题的"观察者之眼"。


感谢阅读!如果这篇文章对你有帮助,欢迎点赞、收藏或分享给更多正在搭建日志系统的朋友。🚀

相关推荐
Qayrup7 小时前
docker 搭建私有仓库,推送并拉取
运维·docker·容器
郭庆汝7 小时前
docker拉取英伟达官方cuda11.8镜像
docker·cuda11.8
天下不喵8 小时前
Ubuntu24.04安装Docker过程记录
docker
黑黍9 小时前
如何在k8s中配置并使用nvidia显卡
云原生·容器·kubernetes
冷血~多好10 小时前
使用docker部署elk,实现日志追踪
elk·docker·容器
会飞的小蛮猪10 小时前
SkyWalking运维之路(Java探针接入)
java·运维·经验分享·容器·skywalking
天一生水water11 小时前
docker-compose安装
运维·docker·容器
蓝象_11 小时前
docker安装配置mysql
mysql·docker·容器
Cxzzzzzzzzzz12 小时前
Kubernetes 架构
容器·架构·kubernetes
一叶知秋yyds12 小时前
Centos 安装 Docker教程
linux·docker·centos