Loki 日志收集概述
引言
日志收集是现代系统监控和故障排查的核心环节。Grafana Loki是一个开源的日志聚合系统,专为高效率和低成本设计,特别适合云原生环境。与传统的ELK(Elasticsearch、Logstash、Kibana)栈相比,Loki通过索引日志元数据而非内容本身,大幅降低了存储和计算开销。
Loki 日志收集的核心概念
1. 日志收集流程
Loki的日志收集分为三个阶段:
- 采集(Scraping):从目标系统(如容器、虚拟机)拉取日志。
- 处理(Processing):通过Pipeline对日志进行过滤、格式转换。
- 存储(Storing):将日志和元数据分别存入对象存储(如S3)和索引存储(如BoltDB)。
2. 关键组件
- Promtail:Loki的官方日志采集代理,负责发现目标并推送日志。
- Loki:主服务,处理查询和存储。
- Grafana:用于日志查询和可视化。
备注
Loki不解析日志内容,而是通过标签(Labels)快速定位日志流,这使得它的存储效率比全文索引系统高10倍以上。
实际案例:收集Docker容器日志
步骤1:配置Promtail
以下是一个简单的Promtail配置示例,用于收集Docker容器的日志:
yaml
# promtail-config.yaml
server:
http_listen_port: 9080
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
relabel_configs:
- source_labels: ['__meta_docker_container_name']
target_label: 'container'
步骤2:启动Loki和Promtail
使用Docker Compose快速启动服务:
yaml
# docker-compose.yaml
version: '3'
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
promtail:
image: grafana/promtail:latest
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "./promtail-config.yaml:/etc/promtail/config.yaml"
步骤3:在Grafana中查询日志
启动后,在Grafana的Explore界面输入LogQL查询:
logql
{container="my-app"} |= "error"
这将显示所有包含"error"的日志行。
高级特性:日志处理Pipeline
Loki支持在客户端(Promtail)或服务端对日志进行加工。例如,提取JSON字段作为标签:
yaml
pipeline_stages:
- json:
expressions:
level: log_level
- labels:
level:
输入日志:
json
{"log_level": "error", "message": "Failed to connect"}
输出结果:自动添加标签 level="error"
。
总结
Loki的日志收集通过轻量级设计解决了传统方案的成本问题,尤其适合:
- 云原生环境(Kubernetes、Docker)
- 需要长期存储但预算有限的场景
- 与Prometheus、Grafana集成的监控体系
延伸资源
- 官方文档:LogQL查询语言
- 练习:尝试在本地用Docker部署Loki,并收集Nginx访问日志。
提示
调试技巧:使用 curl -G -s "http://loki:3100/ready"
验证Loki服务状态。