第十三章:故障排查

掌握 Loki 常见问题的诊断和解决方法。

最后更新: 2024-01-27
页面目录

Loki 故障排查

本章节介绍 Loki 常见问题的诊断和解决方法。

常用诊断命令

检查服务状态

# 检查 Loki API
curl http://localhost:3100/ready

# 检查配置
curl http://localhost:3100/config

# 查看版本
curl http://localhost:3100/loki/api/v1/version

# 查看集群状态
curl http://localhost:3100/cluster/memberlist

检查日志

# Docker
docker logs loki

# Systemd
journalctl -u loki -f

# Kubernetes
kubectl logs -n loki -l app=loki -f

连接问题

Promtail 无法连接 Loki

症状

level=error msg="send error" status=500

排查

# 1. 检查 Loki 是否运行
curl http://loki:3100/ready

# 2. 检查网络连通性
nc -zv loki 3100

# 3. 检查防火墙
firewall-cmd --list-ports

解决方案

# Promtail 配置
client:
  url: http://loki:3100/loki/api/v1/push
  timeout: 30s
  backoff_config:
    min_period: 500ms
    max_period: 5m
    max_retries: 10

认证失败

症状

HTTP 401 Unauthorized

排查

# 检查认证配置
curl -u admin:password http://loki:3100/ready

# 检查用户文件
cat /etc/loki/users.txt

解决方案

# 启用认证
auth_enabled: true

# 或禁用认证(测试环境)
auth_enabled: false

存储问题

无法写入存储

症状

level=error msg="failed to flush chunks" err="store put chunk"

排查

# 1. 检查存储配置
curl http://loki:3100/config | grep -A 10 storage

# 2. 测试存储连接
aws s3 ls s3://loki-bucket/

# 3. 检查权限
aws s3api get-bucket-policy --bucket loki-bucket

解决方案

storage_config:
  aws:
    bucketnames: loki-chunks
    region: us-east-1
    access_key_id: ${AWS_ACCESS_KEY_ID}
    secret_access_key: ${AWS_SECRET_ACCESS_KEY}

磁盘空间不足

症状

level=error msg="failed to write: no space left on device"

排查

# 检查磁盘空间
df -h

# 检查大文件
du -sh /data/loki/*

解决方案

# 清理旧数据
kubectl exec -n loki loki-compactor-0 -- \
  rm -rf /var/loki/boltdb-shipper/*

# 或增加存储
kubectl patch pvc -n loki data-loki-0 \
  --patch '{"spec":{"resources":{"requests":{"storage":"100Gi"}}}}'

查询问题

查询超时

症状

timeout exceeded (500ms)

排查

# 检查查询延迟
curl -G "http://loki:3100/loki/api/v1/query_range" \
  --data-urlencode 'query={job="nginx"}' \
  --data-urlencode 'limit=10'

解决方案

# 增加超时时间
limits_config:
  query_timeout: 300s

querier:
  query_timeout: 300s
  engine:
    timeout: 300s

慢查询

排查

# 启用查询日志
loki -logql.analyze=true

# 查看慢查询
curl http://loki:3100/query_engine

解决方案

# 优化查询
limits_config:
  max_entries_limit_per_query: 5000
  max_query_parallelism: 32

性能问题

Ingester 内存高

症状

level=warn msg="memory usage too high"

排查

# 查看内存使用
curl http://loki:3100/ingester/memory

解决方案

ingester:
  chunk_target_size: 1048576     # 减小
  max_chunk_age: 30m              # 减少保留时间
  chunk_retain_period: 30s

查询队列满

症状

level=warn msg="query queue full"

排查

# 查看队列状态
curl http://loki:3100/query_scheduler/queue

解决方案

query_scheduler:
  max_outstanding_per_tenant: 4096

frontend:
  max_outstanding_per_tenant: 4096

数据问题

日志丢失

排查

# 1. 检查 WAL
ls -la /var/loki/wal/

# 2. 检查 Promtail 位置文件
cat /var/lib/promtail/positions.yaml

解决方案

# 启用 WAL
ingester:
  wal:
    enabled: true
    dir: /var/loki/wal
    flush_on_shutdown: true

重复日志

排查

# 检查 Promtail 位置
cat /var/lib/promtail/positions.yaml

# 查看日志偏移量
grep -A5 "nginx" /var/lib/promtail/positions.yaml

解决方案

# 重置位置文件
rm /var/lib/promtail/positions.yaml
# 或删除特定文件条目

集群问题

Memberlist 故障

症状

level=error msg="failed to join memberlist"

排查

# 查看 memberlist 状态
curl http://loki:3100/cluster/memberlist

解决方案

memberlist:
  join_members:
    - loki-0.loki-headless:7946
    - loki-1.loki-headless:7946
    - loki-2.loki-headless:7946

分片不均衡

排查

# 查看 ingester 状态
curl http://loki:3100/ingester/ring

解决方案

# 重置不均衡的 ingester
kubectl exec -n loki loki-ingester-0 -- \
  ingester-utility -actor=shutdown

日志分析

启用调试日志

# 命令行启用
loki -log.level=debug

# 配置文件
log_level: debug

日志格式

log_format: json
log_level: info

常用调试 API

API 说明
/ready 健康检查
/config 查看配置
/metrics Prometheus 指标
/ingester/ring Ingestion 状态
/cluster/memberlist Memberlist 状态
/query_scheduler/queue 查询队列

获取帮助

社区支持

  • GitHub Issues:https://github.com/grafana/loki/issues
  • Grafana Community:https://community.grafana.com/
  • Slack:#loki channel

日志级别

级别 说明
debug 详细调试信息
info 一般信息
warn 警告信息
error 错误信息

下一步

恭喜你完成了 Loki 权威教程的所有章节!

👉 返回目录