2026 Loki 日志聚合系统:Docker 部署构建轻量级日志中心

1790 字
9 分钟
2026 Loki 日志聚合系统:Docker 部署构建轻量级日志中心

你有没有试过这种场景:服务器半夜挂了,你想查日志看原因,结果 journalctl 刷了几千行——不知道从哪里看起。想搜个关键词,grep 半天没结果,日志文件还轮转了好几次,根本找不到出事那一刻的记录。

Loki 就是来解决这个问题的。它是 Grafana Labs 用 Go 开发的日志聚合系统,灵感来自 Prometheus,但专门为日志设计。跟 ELK(Elasticsearch + Logstash + Kibana)那种重量级方案不同,Loki 的理念是 只索引元数据,不索引日志内容——这使它极其轻量、省资源。

更重要的是,Loki 跟 Prometheus、Grafana 天然是一家。指标出问题 → 点一下跳到对应时间段的日志 → 定位根因,这种联动操作在 Grafana 里一键完成。


一、Loki 架构与核心组件#

组件一览#

组件作用Docker 镜像
Loki日志存储与查询引擎grafana/loki
Promtail日志采集与推送(类似 Logstash)grafana/promtail
Grafana日志查询与可视化grafana/grafana

工作流程#

日志文件 → Promtail 采集 → Loki 存储 → Grafana 查询

Promtail 在每台需要采集日志的服务器上运行,读取日志文件后打上标签(如 job=nginxhost=web01),推送到 Loki。Loki 只索引这些标签,日志内容以压缩块存储。查询时通过标签先缩小范围,再扫描日志内容。

跟 ELK 对比#

对比项LokiELK (Elasticsearch + Logstash + Kibana)
语言GoGoJava 🐘
索引策略仅索引标签(Label)全文索引
资源占用极低(~50MB)高(ES 至少 2GB+)
Docker 镜像大小~50MB~800MB+
查询语言LogQL(类 PromQL)DSL(JSON 查询)
Grafana 原生集成原生需额外配置
全文搜索支持但较慢(扫描模式)极快
适用场景自建监控、小规模日志企业级大数据日志分析
运维复杂度

结论: 个人博客、小团队 VPS 集群这些场景,Loki 比 ELK 友好太多了。一个 1 核 2G 的服务器就能跑整套 Loki + Prometheus + Grafana,换成 ELK 连 Elasticsearch 都启动不起来。


二、Docker Compose 一键部署#

把 Loki 加入我们已有的监控栈中:

docker-compose.yml#

version: '3.8'
services:
loki:
image: grafana/loki:latest
container_name: loki
restart: unless-stopped
ports:
- "3100:3100"
volumes:
- ./loki:/etc/loki
- loki_data:/loki
command:
- '-config.file=/etc/loki/loki-config.yml'
promtail:
image: grafana/promtail:latest
container_name: promtail
restart: unless-stopped
ports:
- "9080:9080"
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail:/etc/promtail
command:
- '-config.file=/etc/promtail/promtail-config.yml'
depends_on:
- loki
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
- prometheus_data:/prometheus
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
depends_on:
- loki
- prometheus
volumes:
loki_data:
prometheus_data:
grafana_data:

Loki 配置文件#

loki/loki-config.yml

auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
ring:
kvstore:
store: inmemory
replication_factor: 1
schema_config:
configs:
- from: 2024-01-01
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /loki/index
cache_location: /loki/index_cache
shared_store: filesystem
filesystem:
directory: /loki/chunks
limits_config:
ingestion_rate_mb: 10
ingestion_burst_size_mb: 20

Promtail 配置文件#

promtail/promtail-config.yml

server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
# 系统日志
- job_name: syslog
static_configs:
- targets: [localhost]
labels:
job: varlogs
host: vps1
__path__: /var/log/*.log
# Docker 容器日志
- job_name: docker
pipeline_stages:
- docker:
static_configs:
- targets: [localhost]
labels:
job: docker
host: vps1
__path__: /var/lib/docker/containers/*/*-json.log

启动#

Terminal window
# 创建配置目录
mkdir -p loki promtail prometheus<br />
# 启动所有服务
docker compose up -d
# 检查运行状态
docker compose ps

访问 http://你的IP:3100/ready,如果返回 Ready 说明 Loki 正常运行。然后打开 Grafana http://你的IP:3000,添加 Loki 数据源:

  1. 左侧齿轮 → Data Sources → Add data source
  2. 选择 Loki
  3. URL 填 http://loki:3100
  4. Save & Test

三、LogQL 查询技巧#

LogQL 是 Loki 的查询语言,跟 PromQL 语法非常相似。

基础查询#

# 查看所有日志
{job="varlogs"}
# 只看某个主机的日志
{host="vps1"}
# 组合标签过滤
{job="docker", host="vps1"}

关键词搜索#

# 搜索包含 error 的日志
{job="varlogs"} |= "error"
# 不包含某个词
{job="varlogs"} != "debug"
# 正则匹配
{job="varlogs"} |~ "(error|panic|fatal)"
# 正则排除
{job="varlogs"} !~ "health|keepalive"

统计与分析#

# 统计每小时的错误数量
sum by (host) (count_over_time({job="varlogs"} |= "error" [1h]))
# 查看 Top 5 日志来源
topk(5, count by (host) ({job="docker"} |= "error"))
# 计算日志增长率
rate({job="varlogs"} |= "error" [5m])

实用查询模板#

你要查什么LogQL 查询
最近 5 分钟的错误`{job=“varlogs”}
Nginx 404 请求`{job=“varlogs”}
Docker 容器崩溃`{job=“docker”}
SSH 登录失败`{job=“varlogs”}
OOM Killer`{job=“varlogs”}
特定时间范围在 Grafana 里选择时间范围即可

四、Grafana 日志联动#

从指标跳转到日志#

这是 Loki + Prometheus + Grafana 组合拳的精髓:

  1. 在 Grafana 的 Prometheus 仪表盘上看到 CPU 飙高
  2. 点击图表 → Explore → 自动切换到日志视图
  3. 选择 Loki 数据源 → 自动带上当前时间范围
  4. errorpanic → 立刻看到异常时刻的日志

关联标签是关键——Prometheus 和 Loki 共用相同的标签命名规范(如 jobinstancehost),这样才能实现无缝跳转。

设置日志面板#

在 Dashboard 中添加 Logs Panel:

  1. 新建 Panel
  2. 数据源选 Loki
  3. 查询:{job="varlogs"} |= "$search"
  4. 右侧 Visualization 选 Logs
  5. 设置刷新间隔 10s

这样你的监控仪表盘上就有实时日志流了。


五、常见问题 FAQ#

Q1:Loki 的日志会占用多少磁盘空间?#

相比 ELK 少得多。Loki 默认使用 gzip 压缩日志块,压缩率通常在 5:1 到 10:1 之间。一个每天产生 1GB 日志的服务器,Loki 存下来大概 100-200MB。

Q2:Promtail 采集不到日志怎么办?#

常见排查步骤:

  1. 检查 Promtail 启动日志:docker logs promtail | tail -20
  2. 确认路径权限:Promtail 容器需要能读取 /var/log/*.log
  3. 检查 Loki 是否就绪:curl http://localhost:3100/ready
  4. 在 Promtail 配置里调高日志级别加 -log.level=debug

Q3:Loki 可以做全文搜索吗?#

可以但不建议。 Loki 的全文搜索是通过扫描压缩块实现的,小范围搜索(如最近 1 小时的日志)很快,但跨天搜索就很慢了。如果需要快速全文搜索,可以考虑 Loki 的倒排索引模式或直接上 ELK。

Q4:1 核 2G VPS 跑 four 组件(Loki + Promtail + Prometheus + Grafana)会不会卡?#

实测没问题。这四兄弟加起来大概 300-400MB 内存,CPU 占用很轻。Loki 本身约 50MB,Prometheus 约 200MB,Grafana 约 100MB,Promtail 约 30MB。

Terminal window
# 来看实际内存占用
docker stats --no-stream

Q5:日志保留多久?怎么清理?#

Loki 默认不自动清理日志。你可以在配置里添加保留策略:

limits_config:
retention_period: 720h # 30 天
retention_size: 50GB # 总量上限

也可以通过 table_manager 按时间删除旧表:

table_manager:
retention_deletes_enabled: true
retention_period: 720h

Q6:Loki 支持哪些日志来源?#

来源采集方式
系统日志Promtail 直接采集
Docker 容器日志Promtail 采集 Docker JSON 日志
Nginx/Apache 日志Promtail 配置对应路径
应用日志应用直接推送或写文件由 Promtail 采集
JournaldPromtail journald 采集器
其他服务器每台机器部署一个 Promtail

六、总结:你的完整可观测体系#

到此为止,三篇文章搭建了一套完整的可观测性平台:

项目用途文章
Prometheus指标采集与告警Prometheus 部署教程
Grafana可视化仪表盘Grafana 部署教程
Loki日志聚合与分析本文

这一套组合在 1 核 2G 的 VPS 上就能完整运行,费用就是 VPS 本身的月租,没有任何额外的 SaaS 订阅费。

指标异常 → 查日志定位 → 修复上线——这个运维闭环,现在只需要一个浏览器窗口就能完成。需要一个浏览器窗口就能完成。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
2026 Loki 日志聚合系统:Docker 部署构建轻量级日志中心
https://www.kshare.top/posts/2026-loki-日志聚合系统docker-部署构建轻量级日志中心/
作者
Kshare
发布于
2026-06-25
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
站点已开启广告(类型:弹窗广告),给您带来的不便敬请谅解。如有更好的广告建议,欢迎发送邮件至 t9uzrz6u@anonaddy.me,感谢您的支持!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
187
分类
9
标签
190
总字数
490,175
运行时长
0
最后活动
0 天前

文章目录