Grafana Loki 日志收集可视化教程

Grafana Loki 是由 Grafana Labs 开发的日志聚合系统,设计灵感来自 Prometheus。与传统的 ELK Stack 不同,Loki 不索引日志内容,只索引元数据标签,因此资源消耗极低。配合 Promtail 采集日志、Grafana 可视化查询,构成了轻量级的日志监控栈。

一、架构概述

  • Loki:日志存储和查询引擎,负责接收、存储和检索日志数据。
  • Promtail:日志采集代理,负责发现和读取日志文件并发送到 Loki。
  • Grafana:可视化界面,用于查询和展示日志数据。

二、Docker Compose 部署

创建 /opt/loki/docker-compose.yml

mkdir -p /opt/loki
cat > /opt/loki/docker-compose.yml <<'EOF'
version: '3.8'

services:
  loki:
    image: grafana/loki:latest
    container_name: loki
    restart: unless-stopped
    ports:
      - "3100:3100"
    volumes:
      - ./loki-config.yml:/etc/loki/local-config.yaml
      - loki-data:/loki
    command: -config.file=/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    restart: unless-stopped
    volumes:
      - ./promtail-config.yml:/etc/promtail/config.yml
      - /var/log:/var/log:ro
      - promtail-positions:/tmp
    command: -config.file=/etc/promtail/config.yml
    depends_on:
      - loki

  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=your_secure_password

volumes:
  loki-data:
  promtail-positions:
  grafana-data:
EOF

三、Loki 配置

cat > /opt/loki/loki-config.yml <<'EOF'
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: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

limits_config:
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  max_query_series: 5000

storage_config:
  tsdb_shipper:
    active_index_directory: /loki/tsdb-index
    cache_location: /loki/tsdb-cache

compactor:
  working_directory: /loki/compactor
  compaction_interval: 10m
  retention_enabled: true
  retention_delete_delay: 2h
  retention_delete_worker_count: 150
EOF

四、Promtail 配置

cat > /opt/loki/promtail-config.yml <<'EOF'
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: syslog
    static_configs:
      - targets:
          - localhost
        labels:
          job: syslog
          host: bwg-vps-01
          __path__: /var/log/syslog

  - job_name: auth
    static_configs:
      - targets:
          - localhost
        labels:
          job: auth
          host: bwg-vps-01
          __path__: /var/log/auth.log

  - job_name: nginx-access
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx
          type: access
          __path__: /var/log/nginx/access.log
    pipeline_stages:
      - regex:
          expression: '^(?P[\w\.]+) - (?P[^ ]*) \[(?P[^\]]+)\] "(?P\w+) (?P[^ ]+) (?P[^"]+)" (?P\d+) (?P\d+)'
      - labels:
          method:
          status:

  - job_name: nginx-error
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx
          type: error
          __path__: /var/log/nginx/error.log
EOF

启动服务

cd /opt/loki
docker compose up -d

五、在 Grafana 中配置 Loki 数据源

登录 Grafana(http://你的IP:3000),进入「Connections」→「Data Sources」→「Add data source」→ 选择「Loki」:

  • URLhttp://loki:3100(Docker 网络内部地址)。
  • 点击「Save & Test」验证连接。

六、LogQL 查询语言

LogQL 是 Loki 的查询语言,语法类似 PromQL:

6.1 日志流选择器

# 查看所有 syslog 日志
{job="syslog"}

# 查看 nginx 访问日志
{job="nginx", type="access"}

# 包含特定关键字
{job="syslog"} |= "error"

# 排除特定关键字
{job="syslog"} != "debug"

# 正则匹配
{job="nginx"} |~ "status=(4|5)\\d{2}"

6.2 指标查询

# 每分钟日志行数
rate({job="nginx"}[1m])

# 每分钟错误日志数
rate({job="nginx"} |= "error" [5m])

# 按状态码统计请求数
sum by (status) (rate({job="nginx", type="access"}[5m]))

# 统计不同级别的日志数量
count_over_time({job="syslog"} |= "error" [1h])

七、告警配置

在 Grafana 中可以基于 Loki 日志创建告警规则。例如当错误日志频率超过阈值时发送通知:

  • 在 Grafana 中创建新的 Alert Rule。
  • 选择 Loki 数据源。
  • 查询表达式:rate({job="nginx"} |= "error" [5m]) > 10
  • 配置通知渠道(参考 Grafana 告警与 Webhook 集成教程)。

八、采集 Docker 容器日志

在 Promtail 配置中添加 Docker 日志采集:

scrape_configs:
  - job_name: docker
    static_configs:
      - targets:
          - localhost
        labels:
          job: docker
          __path__: /var/lib/docker/containers/*/*-json.log
    pipeline_stages:
      - json:
          expressions:
            log: log
            stream: stream
            time: time
      - output:
          source: log

需要在 Docker Compose 中将 Docker 日志目录挂载到 Promtail 容器。

九、数据保留策略

在 Loki 配置中设置数据保留时间:

limits_config:
  retention_period: 30d

compactor:
  retention_enabled: true
  retention_delete_delay: 2h

十、常见问题

Promtail 无法发送日志

# 查看 Promtail 日志
docker logs promtail

# 检查 Loki 是否正常
curl http://localhost:3100/ready

查询速度慢

Loki 的查询性能取决于标签的设计。避免创建过多高基数标签(如 IP 地址),合理使用标签过滤可以显著提升查询速度。

总结

Grafana Loki 是轻量级日志管理的最佳选择,相比 ELK Stack 资源消耗更低,非常适合搬瓦工 VPS 这样的单机环境。配合 Prometheus 的指标监控,可以实现日志和指标的统一观测。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 的循环折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。