日志散在各台服务器上,出问题逐台 SSH grep 到天亮?Loki 是轻量答案:像 Prometheus 一样查日志,不吃资源,单机也能跑。这篇从架构到部署完整讲透。日志基础管理见Linux 日志管理与 logrotate。
一、为什么是 Loki,而不是 ELK
日志聚合的经典方案是 ELK(Elasticsearch + Logstash + Kibana),但它重:JVM 起步 1G 内存,三套组件运维复杂,小团队玩不转。
Loki 的设计哲学:日志不建全文索引,只按标签(job、host、level)索引,内容压缩存储。换来的是:
| Loki | ELK | |
|---|---|---|
| 内存占用 | 百 MB 级 | GB 级 |
| 查询语言 | LogQL(类 PromQL) | Lucene DSL |
| 索引 | 标签索引,内容扫描 | 全文倒排索引 |
| 运维成本 | 单二进制 + 一个 agent | 三组件集群 |
| 查询能力 | 按标签过滤强,全文检索弱 | 全文检索强 |
一句话选型:日志量中等、按标签/时间维度查得多、机器资源紧——Loki;要复杂全文检索、日志量巨大、有专职运维——ELK。个人和小团队,Loki 是性价比之王。
二、架构:三个组件
各服务器 ──> Promtail(采集日志,打标签)──> Loki(存储+索引)──> Grafana(查询看板)
│
Prometheus(告警)| 组件 | 职责 | 资源 |
|---|---|---|
| Promtail | 部署在每台被采集机上,tail 日志文件加标签推 Loki | 极轻 |
| Loki | 接收、存储、查询 | 单机模式够小团队用 |
| Grafana | 查询界面 + 看板(可选但强烈建议) | 200MB 级 |
三、部署:Docker Compose 一套带走
在中心机上建 docker-compose.yml:
version: "3"
services:
loki:
image: grafana/loki:latest
ports:
- "127.0.0.1:3100:3100"
volumes:
- ./loki-config.yml:/etc/loki/local-config.yaml:ro
- /data/loki:/loki
command: -config.file=/etc/loki/local-config.yaml
restart: unless-stopped
promtail:
image: grafana/promtail:latest
volumes:
- ./promtail-config.yml:/etc/promtail/config.yml:ro
- /var/log:/var/log:ro # 采集本机日志
command: -config.file=/etc/promtail/config.yml
restart: unless-stopped
grafana:
image: grafana/grafana:latest
ports:
- "127.0.0.1:3000:3000"
volumes:
- /data/grafana:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=你的强密码
restart: unless-stoppedLoki 配置(loki-config.yml,单机模式):
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
limits_config:
retention_period: 720h # 日志保留 30 天,按磁盘调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: system
static_configs:
- targets: [localhost]
labels:
job: syslog
host: server-01 # 每台机改这里,查询时按 host 筛
__path__: /var/log/*.log
- job_name: nginx
static_configs:
- targets: [localhost]
labels:
job: nginx
host: server-01
__path__: /var/log/nginx/*.logdocker compose up -d
docker compose logs loki | tail # 看启动无错采集其他服务器:在那台机器上也跑一个 Promtail 容器,clients.url 指向中心机的 Loki 地址,host 标签改成自己的名字——采集端是分布式,存储和查询在中心机,这就是整套系统的扩展方式。
四、查询:LogQL 十分钟上手
Grafana 添加 Loki 数据源(http://loki:3100),Explore 里开查。LogQL 分两类:
1. 日志流选择器(按标签过滤)
{job="nginx"} # 所有 nginx 日志
{job="nginx", host="server-01"} # 某台机的 nginx 日志
{job=~"nginx|syslog"} # 多个 job2. 行过滤 + 解析(在选中的流里筛内容)
# 只看含 500 的行
{job="nginx"} |= "500"
# 排除含健康检查的行
{job="nginx"} != "healthcheck"
# 正则提取:把 nginx 日志里的 IP 提出来统计
{job="nginx"} | regexp `(?P<ip>\d+\.\d+\.\d+\.\d+)` | line_format `{{ .ip }}`
# 统计 TOP 请求 IP(count over 聚合)
sum by (ip) (count_over_time({job="nginx"} | regexp `(?P<ip>\d+\.\d+\.\d+\.\d+)` [5m]))实战三板斧(出问题时按这个顺序查):
# 1. 最近一小时全系统错误
{job=~".+"} |= "error" | __error__="" [时间范围选 1h]
# 2. 某台机最近 15 分钟的全部日志(定位时间线)
{host="server-01"}
# 3. 错误率突增的时间点
sum(rate({job="nginx"} |= "error" [5m]))配套的 Nginx 日志分析技巧见Web 日志分析实战。
五、看板与告警
常用看板
Grafana 里建三个面板就够日常:
- 日志量总览:
sum by (job) (rate({job=~".+"}[5m]))——哪个服务的日志在暴涨 - 错误日志:
{job=~".+"} |= "error"——直接列出错误行 - 访问 TOP:上面的 IP 统计面板
告警(Grafana Alerting)
对 Loki 查询设阈值告警:
- 5 分钟内 error 日志超过 N 条 → 通知
- 某 host 日志突然静默(
absent查询)→ 采集端或服务挂了 → 通知
告警通道(邮件/Telegram/企业微信)配置见Prometheus 监控入门的告警章节。
六、运维要点
1. 磁盘是唯一需要盯的
日志全压缩存本地,磁盘就是成本:
du -sh /data/loki # 每月看一次增长30 天保留 + 日均 1G 日志 ≈ 15–30G,普通 SSD 无压力。要更长保留 → 接对象存储(改 storage.filesystem 为 S3 协议),方案见对象存储实战。
2. 日志本身要 rotate
Promtail 采集的是文件,源日志不 rotate 会无限涨——logrotate 是前置条件,不是可选项,配置见Linux 日志管理。
3. 采集端资源
Promtail 很轻(几十 MB 内存),但在被采集机上别忘资源限制:
docker run -d --name promtail --memory=128m --cpus=0.5 ...容器资源限制见Docker 安全加固与资源限制。
4. 网络暴露
Loki 的 3100 端口不要暴露公网——上面的 compose 绑的是 127.0.0.1。Grafana 要外访就单独反代加鉴权,配置套路同其他自托管服务(见Uptime Kuma 状态页里的反代示例)。
七、常见问题排查
| 症状 | 原因 | 解决 |
|---|---|---|
| Grafana 查不到日志 | 数据源配错 / 没数据 | 先查 {job="syslog"};看 promtail 日志有无推送错误 |
| 只有部分日志 | __path__ 没覆盖 / 权限 | 容器挂载对应目录;/var/log 只读挂载注意子目录 |
| positions 丢失导致重复采集 | 没给 promtail 持久化 positions | 挂卷保存 /tmp/positions.yaml 位置 |
| Loki 启动即退出 | 配置 schema/存储路径问题 | docker compose logs loki 看具体报错 |
| 查询很慢 | 时间范围太大 / 无标签过滤 | 先选标签再查;范围从 15 分钟起 |
排查方法论见服务器故障排查完全手册。
结语
Loki 让"集中查日志"从重装机变成了轻装备:一个 Loki + 每台机一个 Promtail + Grafana,三件套跑在 4核8G 的机器上,日志全集中、错误秒定位、异常有告警。对管着三五台服务器的小团队,这是监控体系里性价比最高的一块拼图。
需要搭日志和监控系统的服务器,可以看看财富云计算:NAT 型云服务器内存档位全、SSD 系统盘 + 数据盘存日志,价格比独立 IP 机型省一半以上——跑监控、日志这类"吃配置不吃公网 IP"的系统,NAT 型刚好对症。
延伸阅读
- Homepage 个人仪表盘:把散落各处的服务收进一个首页
- SSL 证书完全指南:免费证书、自动续期与不过期监控
- 数据备份体系完全手册:从随手拷到 3-2-1,让数据永远丢不了
- 压测与容量规划:上线前就知道你的服务器能扛多少人
- AdGuard Home 内网 DNS:全家去广告、防劫持、内网解析一站解决
- Hugo 静态博客搭建:秒开的博客,部署只要一个目录
- 安全应急响应完全手册:服务器被入侵后,按这个流程走
- 游戏服运营完全手册:从开服到停服,把一台服务器运营成百年老店

[...]发现服务器可能被入侵的那一刻,人的本能是慌+乱试。这篇给你一套标准的应急响应流程:遏制 → 取证 → 清除 → 恢复 → 复盘。每一步该做什么、不该做什么,都写清楚。日常防护见服务器安全基线清单。一、第一条铁律:先遏制,别急着"查清楚"被入侵时最大的错误是一边让攻击者继续在里面,一边慢慢排查。正确顺序:遏制(分钟级):切断攻击者的持续访问取证(保留现场,别急着删)清除(清后门、堵漏洞)恢复(从干净[...]
2026-10-19 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-19 回复