扔掉笨重的 ELK,这套轻量级日志收集方案太火了!
具有查询拆分和缓存的作用。:Loki不直接存储日志的完整内容,而是将日志内容存储在对象存储(如AWS S3、Azure Blob Storage、本地文件系统等)中,仅在Loki中存储日志的索引信息。:Loki通常与Promtail(Loki的日志采集代理)一起使用,Promtail负责从本地文件、容器日志等来源采集日志,并将其推送到Loki。:Loki使用类似Prometheus的标签索引机制来
戳下方名片,关注并星标!
回复“1024”获取2TB学习资源!
👉体系化学习:运维工程师打怪升级进阶之路 4.0
— 特色专栏 —
大家好,我是民工哥!
说到日志系统,大家首先想到的就是 ELK(Elasticsearch + Logstash + Kibana)日志平台,其存储和计算成本较高,尤其是Elasticsearch的索引占用空间较大。

综合来说,ELK 更适合需要深度日志内容分析、复杂查询及传统应用场景,而 Loki 适用于云原生环境下基于标签的高效日志过滤与低成本存储。
所以,今天我们一起来聊一聊 Loki 学习的那些事儿!
Loki 简介
Loki 是 Grafana Labs 推出的轻量级日志聚合系统,专为解决大规模日志存储、查询和可视化问题而设计。相比 ELK(Elasticsearch + Logstash + Kibana),Loki 更轻量、更高效,尤其适合 Kubernetes 环境。

Loki 的核心特性
高效存储与查询:Loki不直接存储日志的完整内容,而是将日志内容存储在对象存储(如AWS S3、Azure Blob Storage、本地文件系统等)中,仅在Loki中存储日志的索引信息。这种设计使得Loki能够高效地处理大规模的日志数据,同时保持较低的存储成本和查询延迟。
标签索引机制:Loki使用类似Prometheus的标签索引机制来存储和查询日志数据,这使得它能够快速地进行分布式查询和聚合,而不需要将所有数据都从存储中加载到内存中。
与Prometheus和Grafana集成:Loki与Prometheus的监控生态系统紧密集成,尤其适合与Grafana一起使用,用于实时监控和分析日志数据。用户可以通过Grafana的界面直接查询和可视化Loki中的日志数据,方便进行监控和故障排查。
轻量级与可扩展性:Loki是一个轻量级的日志聚合系统,具有较低的硬件要求,可以在较小的硬件上运行。同时,它支持水平扩展,可以通过添加更多的Loki实例来处理大量的日志数据。
多种日志采集方式:Loki通常与Promtail(Loki的日志采集代理)一起使用,Promtail负责从本地文件、容器日志等来源采集日志,并将其推送到Loki。除了Promtail,Loki还支持其他日志采集工具,如Fluentd和Logstash。
Loki 系统架构
Loki的系统架构主要由以下几个核心组件构成,各组件协同工作以实现日志的高效收集、存储和查询。

Promtail
Promtail 作为Loki的日志采集代理,Promtail负责从本地文件、容器日志等来源采集日志数据。它使用配置文件定义日志的采集路径和标签,通过HTTP API将日志数据发送到Loki。
Promtail支持多种日志采集方式,包括File Target、Journal Target、Syslog Target和Stdin Target,能够灵活适应不同的日志采集需求。
Distributor
Distributor 作为日志数据写入路径的第一个组件,Distributor负责接收Promtail等客户端发送的日志流。它会对接收到的日志流进行正确性校验,并根据日志的元数据(如TenantID、Labels)和哈希算法计算出日志应该分发到哪个Ingester实例上。
Distributor 以并行的方式将日志分发给多个Ingester,以提高写入性能。
Ingester
Ingester 是一个有状态的组件,负责接收Distributor分发过来的日志流,并将日志数据写入长期存储后端。在写入过程中,Ingester会对日志数据进行gzip或snappy压缩操作,并构建和刷新日志块(chunk)。当内存中的日志块达到一定的数量或者时间后,Ingester会将日志块和对应的索引信息刷新到存储系统中。
Ingester还负责处理日志数据的查询请求,从内存中或存储系统中检索日志数据并返回给Querier。
Querier
Querier负责处理日志数据的查询请求。它接收一个时间范围和标签选择器作为查询条件,根据索引信息确定哪些日志块匹配查询条件,并从Ingester和长期存储中检索日志数据。
Querier实现了查询并行化,能够分布式地处理查询请求,提高查询性能。在查询过程中,Querier还会对检索到的日志数据进行去重操作,以确保查询结果的准确性。
Query Frontend
Query Frontend 是一个可选的组件,具有查询拆分和缓存的作用。它可以将一个复杂的查询拆解成多个小查询,并行地在多个Querier组件上进行查询,并将查询结果合并后返回给前端展示。Query Frontend内部有一个内存队列,还可以将其移出作为一个Query Scheduler查询调度器的单独进程运行,以进一步提高查询性能。
Ruler(可选)
Ruler 负责日志告警功能。它可以持续查询一个规则(rule),并将超过阈值的事件推送给AlertManager或者其他告警Webhook服务。
Ruler使得Loki能够实时地监控日志数据,并在发现异常时及时发出告警。
Compactor
Compactor 负责定时对索引进行压缩合并,同时负责日志的删除功能。它可以减少索引的存储空间占用,提高查询性能。
Compactor会定期扫描存储系统中的索引文件,将多个小的索引文件合并成一个大的索引文件,并删除过期的日志数据。
Memcaches(可选)
Memcaches属于外部第三方组件,支持的缓存类型有in-memory、redis和memcached。
它可以在Ingester、Query Frontend、Querier和Ruler上配置Results查询结果缓存、Index索引缓存或Chunks块缓存,以提高系统的响应速度和吞吐量。
Loki 适用场景
推荐使用Loki的场景
-
云原生环境(如Kubernetes集群)的日志管理。
-
需要低成本存储PB级日志的场景(如用户行为分析)。
-
需要与Prometheus监控指标联动的场景。
-
资源受限或对成本敏感的企业。
不推荐使用Loki的场景
-
需要对日志内容进行全文搜索或复杂分析(如NLP、语义分析)。
-
传统应用或非容器化环境的日志管理(ELK可能更合适)。
Loki 对比传统方案
| 维度 | Loki | 传统方案(如ELK) |
|---|---|---|
| 存储成本 |
对象存储+标签索引,成本降低50%+ |
全文索引,存储成本高 |
| 查询性能 |
标签过滤+并行查询,毫秒级响应 |
全文搜索,复杂查询可能秒级以上 |
| 资源占用 |
低内存、低CPU |
高内存、高CPU |
| 扩展性 |
存储与计算分离,支持水平扩展 |
需同时扩展索引和存储节点 |
| 生态集成 |
与Prometheus/Grafana无缝集成 |
需额外集成第三方工具 |
快速部署 Loki(10 分钟实战)
使用 Docker Compose 部署 Loki + Promtail + Grafana
# docker-compose.yml
version: '3'
services:
loki:
image: grafana/loki:2.9.3
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:2.9.3
volumes:
- /var/log:/var/log
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:10.3.2
ports:
- "3000:3000"
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
配置 Promtail 采集日志
# promtail-config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
启动服务
docker-compose up -d
操作指南
我们首先了解一些它的基本语法结构与一些高级功能的基本语法。
基本语法:
-
标签过滤:
{app="nginx"} -
内容匹配:
{app="nginx"} |= "error" -
时间范围:
{app="nginx"} |= "error" |= "500" |= "@timestamp >= \"2023-01-01T00:00:00Z\""
高级功能:
-
聚合查询:
count_over_time({app="nginx"} |= "error"[1m]) -
标签分组:
{app="nginx"} | json | label_format app="{{.app}}-{{.env}}"
日志查询(LogQL 语法)
基本查询
{job="varlogs"} |= "error"
查询 job=varlogs 标签下包含 error 的日志。
时间范围过滤
{job="varlogs"} |= "error" |= "timeout" |~ `\d{3}ms` | json | line_format "{{.msg}}"
查询同时包含 error 和 timeout 的日志,匹配耗时(如 123ms),解析 JSON 字段,并格式化输出。
在 Grafana 中配置 Loki 数据源
-
访问 Grafana(http://localhost:3000)。

-
进入 Configuration > Data Sources,添加 Loki。

-
配置 URL 为
http://loki:3100,保存。

-
创建 Dashboard,使用 LogQL 查询日志。

标签(Label)管理
Loki 按标签索引日志,标签设计直接影响查询效率。
示例标签:
labels: job: "nginx" instance: "web-01" level: "error"
查询优化:
{job="nginx", instance="web-01", level="error"}
Kubernetes 中使用 Loki
Loki 是 Kubernetes 环境下日志聚合的理想选择,其轻量级架构、低成本存储和与 Prometheus 生态的无缝集成,使其成为 ELK 的高效替代方案。
Loki 在 Kubernetes 中的核心组件
Loki 在 Kubernetes 中的部署通常包含以下组件:
| 组件 | 作用 | 部署方式 |
|---|---|---|
| Loki Server |
日志存储与查询服务,接收 Promtail 推送的日志并存储到对象存储(如 S3/MinIO)。 |
通过 Helm Chart 或 Operator 部署。 |
| Promtail |
日志采集 Agent,运行在每个 Node 或 Pod 中,采集日志并推送到 Loki。 |
以 DaemonSet 或 Sidecar 形式部署。 |
| Grafana |
日志可视化工具,通过 LogQL 查询 Loki 中的日志。 |
独立部署或集成到现有 Grafana 实例。 |
| 对象存储 |
长期存储日志数据(如 S3、MinIO、GCS)。 |
需提前配置,Loki 通过 |
快速部署方案(Helm Chart)
安装 Loki + Promtail + Grafana
使用官方 Helm Chart 一键部署:
# 添加 Grafana Helm 仓库
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# 部署 Loki Stack(包含 Loki、Promtail、Grafana)
helm install loki grafana/loki-stack \
--set grafana.enabled=true \
--set promtail.enabled=true \
--set loki.persistence.enabled=true \
--set loki.persistence.size=10Gi \
--set loki.persistence.storageClassName=standard \
--namespace logging --create-namespace
参数说明
persistence.enabled=true #启用持久化存储(默认使用本地存储,生产环境建议替换为对象存储)。
storageClassName #根据集群配置调整。
配置 Promtail 采集 Pod 日志
通过 ConfigMap 自定义 Promtail 的采集规则:
# promtail-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: promtail-config
namespace: logging
data:
promtail.yaml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: kubernetes-pods-name
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
action: keep
regex: my-app # 只采集标签为 app=my-app 的 Pod 日志
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
target_label: pod_name
应用配置
kubectl apply -f promtail-config.yaml
更新 Promtail Deployment
修改 loki-stack 中的 Promtail 配置,挂载自定义的 ConfigMap。
生产环境优化建议
存储优化
使用对象存储:修改 Loki 的 values.yaml,配置 S3/MinIO:
loki:
config:
storage_config:
aws:
s3: s3://your-bucket/loki
s3forcepathstyle: true
region: us-east-1
boltdb_shipper:
active_index_directory: /var/loki/index
cache_location: /var/loki/index_cache
shared_store: aws
持久化存储:若使用本地存储,需配置 storageClassName 和 size,避免数据丢失。
性能调优
调整日志块大小
loki:
config:
chunk_store_config:
max_look_back_period: 30d # 限制日志查询范围
schema_config:
configs:
- from: 2023-01-01
store: boltdb-shipper
object_store: aws
schema: v12
index:
prefix: index_
period: 24h
限制日志保留时间
loki:
config:
table_manager:
retention_deletes_enabled: true
retention_period: 7d # 保留 7 天日志
多租户支持
启用租户 ID
loki:
config:
auth_enabled: true
ingester:
lifecycler:
ring:
kvstore:
store: memberlist
在 Promtail 中配置租户 ID
clients:
- url: http://loki:3100/loki/api/v1/push
tenant_id: "my-tenant" # 指定租户 ID
常见问题与解决方案
日志丢失或未采集
检查 Promtail 日志
kubectl logs -n logging <promtail-pod-name> -c promtail
验证标签匹配:确保 Promtail 的 relabel_configs 正确匹配目标 Pod 的标签。
Loki 查询性能慢
-
优化 LogQL 查询:
-
-
避免全量扫描(如
{job="*"})。 -
使用时间范围和标签过滤。
-
-
扩展 Loki 集群:
增加ingester和querier的副本数。
存储成本过高
启用压缩
loki:
config:
compactor:
working_directory: /var/loki/compactor
shared_store: aws
缩短日志保留时间:调整 retention_period。
通过以上步骤,你可以在 Kubernetes 中高效部署 Loki,实现低成本、高性能的日志聚合与分析!
总结
学习Loki需要从理论到实践逐步深入,结合官方文档、实践教程和社区资源,快速掌握其核心概念和操作方法。
再通过搭建本地环境、部署Kubernetes集群和构建日志仪表盘,逐步提升实战能力。同时,关注性能优化和故障排查,确保Loki在生产环境中的稳定运行。
#日志系统 #日志收集 #日志平台 #ELK #Loki #Kubernetes #Grafana #实用教程 #IT #运维 #科技 #Linux运维 #系统运维
👍 如果你喜欢这篇文章,请点赞并分享给你的朋友!

公众号读者专属技术群
构建高质量的技术交流社群,欢迎从事后端开发、运维技术进群(备注岗位,已在技术交流群的请勿重复添加微信好友)。主要以技术交流、内推、行业探讨为主,请文明发言。广告人士勿入,切勿轻信私聊,防止被骗。
扫码加我好友,拉你进群


一键轻松搭建和管理 VPN(WireGuard)的组网神器,轻松实现安全互联
扔掉 K8s Dashboard !试试这款可视化运维管理神器,轻量、零代码、中文支持
DeepSeek 在运维领域的 24 个落地场景!你的工作正在被 AI 这样替代
比 Nginx 更强大易用!现代化 UI+高性能反向代理+安全防护,确实可以封神了
手把手教你使用 Docker+GPUStack 快速搭建企业级大模型服务平台
41 亿大蛋糕!百度 4 亿、华为云 4 亿、小冰 2.1 亿、商汤 1.8 亿、追一 0.9 亿
三大云厂同时崩?Cursor、ChatGPT 也跟着倒下!网友:整个互联网都要废了
奇安信 4.2 亿、绿盟 2.1 亿、深信服 2 亿、安恒 2 亿、360安全 1.4 亿
公司弃用 Kubernetes 后,部署成功率飙升 89%,事故减少 73%,还不用加班!

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐



所有评论(0)