Grafana Loki는 Prometheus에서 영감을 받은 수평 확장 가능한 로그 집계 시스템이다. 로그 내용을 인덱싱하지 않고 레이블만 인덱싱해 비용 효율적이다.
Loki vs Elasticsearch 비교
| 항목 | Loki | Elasticsearch |
|---|
| 인덱싱 방식 | 레이블만 | 전체 텍스트 |
| 저장 비용 | 낮음 | 높음 |
| 쿼리 언어 | LogQL | Lucene/ES Query |
| 검색 성능 | 레이블 필터링 빠름 | 전문 검색 빠름 |
| Grafana 통합 | 네이티브 | Kibana 별도 필요 |
Loki 아키텍처 구성요소
- •Promtail: 로그 수집 에이전트 (노드별 DaemonSet)
- •Distributor: 수신 요청 분산
- •Ingester: 메모리에 로그 버퍼링 후 스토리지 저장
- •Querier: 스토리지와 인제스터에서 쿼리
- •Query Frontend: 쿼리 분할 및 캐싱
yaml
services:
loki:
image: grafana/loki:3.0.0
ports:
- "3100:3100"
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:3.0.0
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail-config.yaml:/etc/promtail/config.yaml
command: -config.file=/etc/promtail/config.yaml
Promtail 설정
yaml
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- docker: {}
- labels:
app:
namespace:
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
LogQL 쿼리 예시
logql
# 레이블 필터링
{app="nginx", namespace="production"}
# 텍스트 필터
{app="nginx"} |= "error" != "health"
# 메트릭 쿼리 (초당 에러율)
rate({app="nginx"} |= "error" [5m])
# JSON 파싱
{app="api"} | json | status >= 500 | line_format "{{.method}} {{.path}} {{.status}}"