Loki为一个日志存储和查询引擎,它的核心职责是接收、存储日志并处理查询。而日志的采集、处理和推送工作,则交由专门的客户端完成。
一个完整的Loki日志采集与处理流程,通常由以下三个部分组成:

Loki官方及主流的日志采集方式
官方提供了多种客户端来适配不同的场景。
- Promtail:Loki项目自带的官方日志采集器,是当前最主流的选择。
- 功能:专门为Loki设计,能够发现日志文件(如Linux系统中的
/var/log/*.log)、与Docker或Kubernetes深度集成(自动发现容器、获取Pod标签),并为日志流添加标签。 - 适用场景:最通用的场景,特别是Kubernetes环境。通常以DaemonSet方式部署在集群的每个节点上,采集所有Pod的日志。
- Grafana Alloy:Grafana Labs推出的新一代供应商无关的OpenTelemetry采集器。官方已明确,Promtail功能将趋于完结,未来的日志采集功能开发将主要在Alloy中进行。
- 功能:功能更强大,不仅限于日志,还能采集指标、追踪和配置文件。
- 适用场景:新项目或需要统一采集器的理想选择,特别是在采用OpenTelemetry协议的现代化可观测性架构中。
- Docker Driver:一个Docker插件,可以直接在容器内运行,并将容器的标准输出日志(stdout/stderr)发送给Loki。
- 适用场景:简单的Docker环境,无需部署独立的采集器。
- 其他第三方客户端:许多其他日志采集工具也通过插件支持将日志推送到Loki。例如 Fluentd 和 Fluent Bit。
💡 核心要点:Loki是如何“采集”的?
虽然Loki不亲自“伸手”去拿日志,但它定义了一套清晰的“采集”流程:
- 日志发现:客户端(如Promtail)会监控指定的位置。在Kubernetes中,它通过访问Docker Socket或Kubelet API动态发现新创建的Pod并找到其日志文件路径。
- 标签化:客户端会为发现的日志流添加一组标签(Labels),例如
container="spoon-app"、namespace="default"、job="flog_scrape"等。这是Loki的核心设计——它不索引日志内容,只索引这些标签,从而大幅降低存储成本 。 - 推送:经过标签化的日志流会通过HTTP API被推送到Loki服务端。
选项一:使用 Promtail (经典方案)
这是目前最普遍、资料最多的方案,非常适合传统服务器环境。你只需要在每台需要采集日志的服务器上安装 Promtail,并简单配置一下即可。
- 安装:下载 Promtail 的二进制文件或通过包管理器(如
apt)安装。 - 配置:编辑配置文件
promtail-local-config.yaml,核心是告诉它三件事:
- 从哪里读:通过
__path__指定日志文件路径,比如/var/log/*.log或/var/log/nginx/access.log。 - 打什么标签:为日志加上
job="varlogs"、host="my-server"等标签,方便后续在 Loki 中查询。 - 往哪里送:配置 Loki 服务端的地址,例如
http://<你的Loki服务器IP>:3100/loki/api/v1/push。
- 运行:将 Promtail 配置为系统服务(如
systemd),保证它能开机自启并在后台稳定运行。
选项二:使用 Grafana Alloy (前瞻方案)
如果你想用一个统一的客户端来管理所有遥测数据,或者希望技术栈更具未来性,Alloy 是更好的选择。
- 安装:同样可以通过 APT 仓库方便地安装。
- 配置:编辑配置文件
/etc/alloy/config.alloy。虽然语法不同,但逻辑和 Promtail 类似。你需要配置local.file_match来发现日志文件,再用loki.source.file组件去读取,最后用loki.write组件发送给 Loki。 - 运行:同样作为
systemd服务运行,确保它有权限读取日志文件(例如,将alloy用户添加到adm组)。
正文完