19 10 月 2026
日志散在各台服务器上,出问题逐台 SSH grep 到天亮?Loki 是轻量答案:像 Prometheus 一样查日志,不吃资源,单机也能跑。这篇从架构到部署完整讲透。日志基础管理见Linux 日志管理与 logrotate。

一、为什么是 Loki,而不是 ELK

日志聚合的经典方案是 ELK(Elasticsearch + Logstash + Kibana),但它重:JVM 起步 1G 内存,三套组件运维复杂,小团队玩不转。

Loki 的设计哲学:日志不建全文索引,只按标签(job、host、level)索引,内容压缩存储。换来的是:

LokiELK
内存占用百 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-stopped

Loki 配置(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/*.log
docker 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"}                # 多个 job

2. 行过滤 + 解析(在选中的流里筛内容)

# 只看含 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 里建三个面板就够日常:

  1. 日志量总览:sum by (job) (rate({job=~".+"}[5m]))——哪个服务的日志在暴涨
  2. 错误日志:{job=~".+"} |= "error"——直接列出错误行
  3. 访问 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 型刚好对症。

延伸阅读
  1. Homepage 个人仪表盘:把散落各处的服务收进一个首页
  2. SSL 证书完全指南:免费证书、自动续期与不过期监控
  3. 数据备份体系完全手册:从随手拷到 3-2-1,让数据永远丢不了
  4. 压测与容量规划:上线前就知道你的服务器能扛多少人
  5. AdGuard Home 内网 DNS:全家去广告、防劫持、内网解析一站解决
  6. Hugo 静态博客搭建:秒开的博客,部署只要一个目录
  7. 安全应急响应完全手册:服务器被入侵后,按这个流程走
  8. 游戏服运营完全手册:从开服到停服,把一台服务器运营成百年老店
更多阅读
  1. 上一篇:CI/CD 完全指南:从手动 FTP 到自动部署,小团队的正确姿势
  2. 下一篇:游戏服运营完全手册:从开服到停服,把一台服务器运营成百年老店
发表评论 2

取消回复