用途
Grafana Loki 是一个受 Prometheus 启发的日志聚合与查询系统。本技能用于配置 Loki 进行日志聚合与分析,设置 Promtail 采集日志,编写 LogQL 查询,并与 Grafana 集成实现可视化。
适用场景包括:
- 实现高性价比的日志聚合
- 为 Kubernetes 环境构建日志系统
- 将日志与 Grafana 仪表盘集成
- 使用基于标签的过滤查询日志
- 采用比 ELK 更轻量的替代方案
前置条件
- Docker 或 Kubernetes
- Grafana 用于可视化
- Promtail 或其他日志采集器
架构概览
应用日志经 Promtail 采集后推送至 Loki,再由 Grafana 进行查询与可视化。
主要能力
Docker 部署
通过 docker-compose 同时启动 loki、promtail 和 grafana 三个服务。Loki 监听 3100 端口,Grafana 监听 3000 端口,Promtail 挂载宿主机日志目录与 Docker 容器日志目录。
Loki 配置
loki-config.yaml 中可配置:关闭认证、HTTP 监听端口、文件系统存储、schema 配置、boltdb-shipper 索引、查询限制(如拒绝过期样本、最大查询序列数、最大查询并行度)、数据保留策略等。
Promtail 配置
promtail-config.yaml 中可配置:HTTP 监听端口、positions 文件位置、Loki 推送地址,以及多种 scrape_configs,包括系统日志、Docker 容器日志(通过 docker_sd_configs 自动发现)和应用日志(带 JSON 解析管道)。
Kubernetes 部署
可使用 Helm 安装 loki-stack,或通过 DaemonSet 部署 Promtail,挂载 /var/log 和 /var/lib/docker/containers 目录。
LogQL 查询
- 基础查询:按 job、level、namespace、container 等标签过滤,支持正则匹配
- 日志管道:按内容过滤(|=、!=、|~)、JSON 解析、line_format 格式化
- 指标查询:count_over_time、rate、sum by、topk 等
- 聚合:avg_over_time、quantile_over_time、错误百分比计算
管道阶段
Promtail 管道阶段支持:JSON 解析、正则提取、从解析字段添加标签、修改时间戳、过滤日志(match + drop)、添加静态标签、模板修改日志行。
Grafana 集成
可通过 provisioning 配置 Loki 数据源,在仪表盘中添加日志类型面板,设置 showTime、showLabels、wrapLogMessage 等选项。
记录规则与告警
可定义 recording rules 预计算常用查询,以及 alerting rules 在错误率超阈值时触发告警。
常见问题
- 内存占用过高:减少 max_query_series,限制查询时间范围
- 日志未出现:检查 positions 文件、文件路径、标签配置
- 查询超时:增加更具体的标签过滤,缩小时间范围
- 摄入速率限制:提高 limits_config 中的 per_stream_rate_limit
最佳实践
- 使用有意义的标签(避免高基数)
- 先按标签过滤再按日志内容过滤
- 在采集时用 Promtail 解析日志
- 设置合理的保留周期
- 为常用查询使用记录规则
- 大型部署实现多租户
- 监控 Loki 自身指标
- 使用 chunk 缓存提升性能
相关技能
- prometheus-grafana:指标监控
- elk-stack:替代日志方案
- alerting-oncall:告警管理