Docker-Logs zentralisieren - Loki und Promtail mit Docker
Docker-Logs zentralisieren - Loki und Promtail mit Docker
Logs sind nach Container-Neustarts weg, über viele Container verteilt und schwer durchsuchbar — Grafana Loki löst all das.
Das Problem
Standardmäßig schreibt Docker Logs als JSON-Dateien auf den Host. docker logs zeigt sie Container-für-Container. Wer über 10+ Container läuft, sucht bald nach einer zentralen Lösung.
Loki ist eine Log-Aggregations-Datenbank von Grafana Labs — effizienter als Elasticsearch, weil es keine Volltextindex über Log-Inhalte erstellt, sondern Labels nutzt.
Stack: Loki + Promtail + Grafana
services:
loki:
image: grafana/loki:latest
restart: unless-stopped
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
volumes:
- loki-data:/loki
promtail:
image: grafana/promtail:latest
restart: unless-stopped
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail-config.yml:/etc/promtail/config.yml:ro
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:latest
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
depends_on:
- loki
volumes:
loki-data:
grafana-data:
Promtail-Konfiguration
promtail-config.yml:
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
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
- labels:
stream:
- output:
source: log
Promtail liest die Docker-JSON-Log-Dateien direkt, parst sie und sendet sie an Loki. Labels (Container-Name, Stream) ermöglichen gezieltes Filtern.
Grafana einrichten
http://localhost:3000öffnen- Data Sources → Add → Loki
- URL:
http://loki:3100 - Save & Test
LogQL — Loki Query Language
Einfache Abfragen in Grafana Explore:
# Alle Logs eines Containers
{job="docker"} |= "error"
# Logs filtern nach Stream
{job="docker", stream="stderr"}
# Logs die "OOM" enthalten
{job="docker"} |= "OOM"
# Log-Rate (Logs pro Sekunde)
rate({job="docker"}[5m])
Log-Retention konfigurieren
In der Loki-Konfiguration (local-config.yaml):
limits_config:
retention_period: 720h # 30 Tage
Vorteile gegenüber docker logs
| Feature | docker logs | Loki |
|---------|-------------|------|
| Alle Container auf einmal | Nein | Ja |
| Überleben Neustarts | Nein | Ja |
| Volltextsuche | Eingeschränkt | Ja |
| Alerting | Nein | Ja (über Grafana) |
| Retention-Steuerung | Manuell | Konfigurierbar |
Zusammenfassung
Loki + Promtail + Grafana ist der einfachste Weg zu zentralisierten Docker-Logs. Promtail liest die vorhandenen Docker-Logdateien ohne Änderungen am Docker-Daemon — kein Treiber-Wechsel, kein Risiko.