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」:
- URL:
http://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% 的循环折扣。