Docker-Logs zentralisieren mit dem Loki-Log-Driver

Docker-Logs zentralisieren mit dem Loki-Log-Driver

Der Loki Log Driver sendet Container-Logs direkt vom Docker-Daemon an Loki — ohne Promtail als Zwischenschicht.

Zwei Wege zu Loki

Der [vorherige Artikel](2023-06-10-19_00%20-%20Docker-Logs%20zentralisieren%20-%20Loki%20und%20Promtail%20mit%20Docker.md) zeigt den Promtail-Ansatz: Promtail liest Docker-Logdateien vom Host. Der Loki-Log-Driver geht einen anderen Weg: Docker selbst schickt Logs direkt an Loki, kein Promtail nötig.

Plugin installieren

docker plugin install grafana/loki-docker-driver:latest \
  --alias loki \
  --grant-all-permissions
# Plugin-Status prüfen
docker plugin ls

Daemon-weit konfigurieren

In /etc/docker/daemon.json:

{
  "log-driver": "loki",
  "log-opts": {
    "loki-url": "http://localhost:3100/loki/api/v1/push",
    "loki-retries": "5",
    "loki-batch-size": "400",
    "loki-pipeline-stages": ""
  }
}
sudo systemctl restart docker

Achtung: Nach daemon.json-Änderungen müssen alle Container neu gestartet werden, damit der neue Log-Driver greift.

Pro Container konfigurieren

Statt den Daemon umzustellen, lässt sich der Driver per Container setzen:

services:
  myapp:
    image: myapp:latest
    logging:
      driver: loki
      options:
        loki-url: "http://loki:3100/loki/api/v1/push"
        loki-retries: "5"
        loki-batch-size: "400"
        loki-external-labels: "job=myapp,env=production"

Labels automatisch anhängen

logging:
  driver: loki
  options:
    loki-url: "http://loki:3100/loki/api/v1/push"
    loki-external-labels: "container_name={{.Name}},image_name={{.ImageName}}"

Docker-Template-Variablen werden automatisch aufgelöst.

Nachteil: Loki muss verfügbar sein

Der größte Unterschied zum Promtail-Ansatz: Wenn Loki nicht erreichbar ist, schlägt der Log-Write im Container fehl. Das kann Anwendungen blockieren oder verlangsamen.

Promtail hingegen puffert Logs auf Disk und sendet sie, wenn Loki wieder verfügbar ist — deutlich resilienter.

Wann welcher Ansatz?

| | Loki Log Driver | Promtail |
|--|-----------------|---------|
| Setup | Einfacher | Etwas aufwändiger |
| Resilienz bei Loki-Ausfall | Schlecht | Gut (Puffer) |
| docker logs verfügbar | Nein (bei daemon-weitem Driver) | Ja |
| Empfehlung | Dev/Test | Produktion |

docker logs weiterhin nutzen

Wenn der Loki-Driver daemon-weit aktiv ist, funktioniert docker logs nicht mehr — Docker speichert keine lokalen Logs mehr.

Lösung: loki-pipeline-stages mit docker logs-Fallback via multi:

{
  "log-driver": "loki",
  "log-opts": {
    "loki-url": "http://localhost:3100/loki/api/v1/push",
    "max-size": "10m",
    "max-file": "3"
  }
}

Oder: lokalen Log-Driver zusätzlich behalten (nicht möglich mit einem einzelnen Driver — dann besser Promtail nutzen).

Zusammenfassung

Der Loki Log Driver ist die schnellste Möglichkeit, Container-Logs nach Loki zu schicken — ohne Promtail-Container. Für Produktionsumgebungen ist der Promtail-Ansatz stabiler, weil er Logs auf Disk puffert und docker logs erhalten bleibt.