Docker-Container-Logs an UptimeEye senden

Auf einem Docker-Host hast du zwei Möglichkeiten. Ein einzelner Vector-Container liest die Ausgabe aller Container über den Docker-Socket und braucht keine Änderung an deinen Compose-Dateien. Alternativ schickt der Loki-Logging-Driver von Docker die Ausgabe eines Containers direkt – praktisch, wenn du nur wenige Container anbinden willst.

Endpunkt: https://logs.uptimeeye.com/v1/ingest/elasticsearch/_bulk

1.Container-Logs verschicken

Option A: ein Vector-Container für den ganzen Host

Die docker_logs-Source von Vector liest jeden Container mit (auch neue) und kennt Containername, Image und Labels.

vector.yaml
sources:
  docker:
    type: docker_logs
    exclude_containers: [vector]
transforms:
  enrich:
    type: remap
    inputs: [docker]
    source: |
      .service = .container_name
      .image   = .image
      .host    = get_hostname!()
      .env     = "prod"
      parsed, err = parse_json(string!(.message))
      if err == null { . = merge(., parsed) }
      del(.label); del(.source_type); del(.stream)
sinks:
  uptimeeye:
    type: elasticsearch
    inputs: [enrich]
    endpoints: ["https://logs.uptimeeye.com/v1/ingest/elasticsearch/"]
    api_version: v8
    compression: gzip
    healthcheck: { enabled: false }
    request:
      headers:
        Authorization: "Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    query:
      _msg_field: message
      _time_field: timestamp
      _stream_fields: service,host,env
Note: Der Key steht direkt in vector.yaml – mach die Datei nur für root lesbar (chmod 600). Vector löst ${ENV}-Platzhalter in seiner Config nicht auf; willst du den Key in einer eigenen Datei halten, nimm sein Secret-Backend wie auf den Seiten zu Kubernetes und Vector gezeigt.

Neben deinen Services starten

docker-compose.yml
services:
  vector:
    image: timberio/vector:0.49.0-alpine
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./vector.yaml:/etc/vector/vector.yaml:ro
      - vector-data:/var/lib/vector
volumes:
  vector-data:

Option B: der Loki-Logging-Driver pro Container

Der Loki-Driver von Docker spricht das Loki-Push-Protokoll, das UptimeEye annimmt. Der Key kommt als Basic-Auth-Passwort in die URL; Labels werden zu Feldern.

shell
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions

docker run -d --name api \
  --log-driver=loki \
  --log-opt loki-url="https://key:ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@logs.uptimeeye.com/v1/ingest/loki/api/v1/push" \
  --log-opt loki-external-labels="service=api,env=prod" \
  --log-opt loki-batch-wait=2s \
  my-org/api:latest
Note: In Compose stehen dieselben Optionen unter logging: { driver: loki, options: { … } }.

2.Suchen

Jeder Container erscheint als service:=<container name>. Ergänz level:error oder klick im Panel „Felder“ einen Wert an, um einzugrenzen.

Felder, die du bekommst

Diese Felder erscheinen im Panel „Felder“ und funktionieren in jedem Filter:

  • service (Containername)
  • image
  • host
  • env
  • JSON-Felder, die deine Anwendung loggt

Tipps

  • Option A läuft weiter, wenn Container neu starten oder neu erstellt werden; der Loki-Driver erfasst nur Container, die du mit ihm gestartet hast.
  • Bei Anwendungen, die Klartext loggen, bleibt die ganze Zeile die Nachricht; Zeitstempel und Level findest du trotzdem über den Zeitraum und die Wortsuche.

FAQ

Kann ich mit Vector nur einige Container verschicken?

Ja – mit include_containers / exclude_containers an der docker_logs-Source oder mit include_labels, um nach Compose-Label auszuwählen.

Wo bekomme ich den Ingest-Key?

In der App unter API-Keys → Neuer API-Key → Typ „Log-Ingest“. Der Key beginnt mit ue_ingest_ und wird nur einmal angezeigt. Management-Keys (ue_live_) lehnt der Ingest-Endpoint ab.

Wie sehe ich, ob Logs ankommen?

Öffne Logs in der App, wähl den Zeitraum „15 Min.“ und such nach service:=<your service>. Neue Zeilen sind nach etwa einer Sekunde durchsuchbar; Live-Tail zeigt sie mit etwa 6 s Verzögerung.