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

  1. http://localhost:3000 öffnen
  2. Data Sources → Add → Loki
  3. URL: http://loki:3100
  4. 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.