1.Die ersten Zeilen senden
shell
curl -sS -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline?_stream_fields=service,env" \
-H "Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/x-ndjson" \
--data-binary @- <<'JSON'
{"_time":"2026-09-04T11:42:08.877Z","_msg":"deploy finished","service":"ci","env":"prod","level":"info","version":"1.42.0"}
{"_msg":"cache warmed in 1.2s","service":"ci","env":"prod","level":"debug","duration_ms":1200}
JSONNote:
_msg ist die Nachricht, _time die Zeit des Events (RFC 3339; lässt du es weg, gilt die Ankunftszeit). Alles andere ist ein Feld, nach dem du filtern kannst.2.Große Batches komprimieren
Angenommen werden Bodies bis 16 MiB unkomprimiert; gzip wird beim Eingang entpackt, abgerechnet werden die unkomprimierten Bytes.
shell
gzip -c events.ndjson | curl -sS -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline?_stream_fields=service,env" \
-H "Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/x-ndjson" \
-H "Content-Encoding: gzip" \
--data-binary @-3.Eigene Feldnamen zuordnen
Nutzt dein JSON schon message und @timestamp, sag das dem Endpoint, statt deine Events umzuschreiben.
shell
curl -sS -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline?_msg_field=message&_time_field=@timestamp&_stream_fields=service,env" \
-H "Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
--data-binary @events.ndjson4.Basic Auth statt Bearer-Token
Für Tools, die nur Benutzer und Passwort kennen: ein beliebiger Benutzername und der Key als Passwort.
shell
curl -sS -u "key:ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline" --data-binary @events.ndjsonTipps
- Bündeln: Eine Anfrage pro Zeile ist der langsamste Weg, Logs zu senden. Peil Batches von einigen hundert Zeilen oder ein paar Sekunden an.
- Verschachtelte Objekte werden zu Keys mit Punkten flachgeklopft (
http.status→ Feldhttp.status). - Feldnamen unterscheiden Groß- und Kleinschreibung;
Levelundlevelsind zwei Felder.
FAQ
Welche Antwortcodes kann ich bekommen?
200 angenommen · 400 fehlerhaftes JSON oder fehlerhafte Kompression · 401 Key fehlt oder ist unbekannt · 403 Plan ohne Logs · 413 Body über 16 MiB · 415 nicht unterstütztes Content-Encoding · 429 Monatskontingent aufgebraucht (siehe Retry-After) · 502/503 Speicher oder Key-Auflösung vorübergehend nicht verfügbar – mit Backoff erneut versuchen.Gibt es einen Elasticsearch-kompatiblen Endpoint?
Ja:
POST /v1/ingest/elasticsearch/_bulk nimmt das Bulk-Format an, das Filebeat, Vector und der es-Output von Fluent Bit erzeugen. GET /v1/ingest/elasticsearch/ beantwortet den Versions-Handshake.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.Verwandte Seiten
Log files / plain textSchick Klartext-Logs (Spring, log4j, nginx, syslog, jedes Pattern-Layout) ohne Agent an UptimeEye Logs.Node.jsSchick Node.js-Logs an UptimeEye Logs: JSON nach stdout mit pino für Container, ein HTTP-Batcher ohne Abhängigkeiten oder das OpenTelemetry Logs SDK..PythonSchick Python-Logs an UptimeEye Logs: ein logging.Handler, der JSON-Lines per HTTP bündelt, structlog/JSON nach stdout für Container oder der OTel-Handler..Logs durchsuchenJetzt, wo Zeilen ankommen: Filter, Felder, Zeiträume und Live-Tail.