Logs senden

Jede Integrationsanleitung landet bei einem von fünf HTTP-Endpoints, mit demselben Key, demselben Feldmodell und denselben Limits. Diese Seite ist diese gemeinsame Grundlage – lies sie einmal und wähl dann deine Integration.

So funktioniert der Ingest

  • Du sendest Batches per HTTPS an logs.uptimeeye.com, mit einem Ingest-Key.
  • Der Key führt zu deiner Organisation; die Zeilen werden im isolierten Tenant deiner Organisation gespeichert.
  • Jede Zeile wird zu einem Eintrag mit einer Nachricht, einer Zeit und beliebig vielen Feldern. Kein Schema, keine Index-Konfiguration.
  • Etwa eine Sekunde später ist der Eintrag auf der Logs-Seite durchsuchbar; Live-Tail zeigt ihn nach rund 6 s.

Ingest-Keys

Erstell Keys unter API-Keys → Neuer API-Key mit dem Typ „Log-Ingest“. Sie beginnen mit ue_ingest_, werden nur einmal angezeigt und können nur Logs schreiben – ein Management-Key (ue_live_) wird von den Ingest-Endpoints abgelehnt, und ein Ingest-Key kann in deinem Konto nichts lesen oder ändern.

Schick den Key als Bearer-Token oder, für Tools, die nur Benutzer und Passwort kennen, per HTTP Basic Auth (beliebiger Benutzername, der Key als Passwort):

headers
Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# or
Authorization: Basic base64("key:ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
Hinweis: Zum Rotieren erstellst du einen zweiten Key, stellst deine Agents um und widerrufst dann den alten. Der Widerruf greift innerhalb von etwa 30 Sekunden.

Endpoints

Basis-URL https://logs.uptimeeye.com. Alle Endpoints akzeptieren gzip-komprimierte Bodys (Content-Encoding: gzip) bis 16 MiB unkomprimiert.

EndpointFormatTypische Absender
POST /v1/ingest/jsonlineEin JSON-Objekt pro Zeile (NDJSON)curl, Skripte, Fluent Bit http, Logging-Bibliotheken
POST /v1/ingest/textKlartext, ein Eintrag pro Zeile; Zeit und Level werden erkannt, Stacktraces zusammengefasstLogdateien, docker logs, Ausgabe von Spring/log4j
POST /v1/ingest/elasticsearch/_bulkElasticsearch-Bulk-API (GET / und /_license beantworten den Handshake)Vector, Filebeat, Fluent Bit es
POST /v1/ingest/otlp/v1/logsOTLP/HTTP-Logs (protobuf)OpenTelemetry Collector und SDKs, Serilog
POST /v1/ingest/loki/api/v1/pushLoki Push (JSON oder Snappy-Protobuf); Labels werden zu Stream-FeldernPromtail, Grafana Alloy, Docker-Loki-Treiber

Nachricht, Zeit und Felder

Ein Eintrag ist eine flache Menge von String-Feldern. Drei Namen sind besonders; alles andere gehört dir:

FeldBedeutungStandard
_msgDie Nachricht, die in der Liste steht und von Wortabfragen durchsucht wirdder in _msg_field genannte Key, sonst leer
_timeEreigniszeit, RFC 3339 / ISO 8601 oder Unix-Sekunden, -Millisekunden oder -Nanosekundender in _time_field genannte Key, sonst die Ankunftszeit
_streamStream-Labels, gebildet aus _stream_fieldsservice,host, falls vorhanden

Verschachteltes JSON wird zu Namen mit Punkten aufgelöst: {"http":{"status":500}} wird zum Feld http.status. Arrays werden als JSON-Strings gespeichert. Feldnamen unterscheiden Groß- und Kleinschreibung.

Gute Feldhygiene

  • Schick immer service und env mit – sie steuern den Bereich „Felder“, die Setup-Beispiele und die meisten Filter.
  • Pack Kennungen (order_id, user_id, trace_id) in Felder, nicht in den Nachrichtentext.
  • Bleib über alle Services hinweg bei einem Namen pro Konzept (duration_ms, nicht latency hier und took dort).
  • Log-Level als kleingeschriebene Wörter (info, warn, error), damit level:error überall funktioniert.

Stream-Felder

Ein Stream ist die Menge der Einträge mit denselben Werten der Stream-Felder – etwa {service="api", env="prod"}. Streams werden zusammen gespeichert, deshalb ist ein Filter darauf (_stream:{...} oder einfach ein angeklickter Wert eines Stream-Felds) der schnellste Weg, eine Suche einzugrenzen, und der Bereich „Felder“ listet Stream-Felder zuerst.

  • Wähl sie pro Request mit _stream_fields=service,env (Query-Argument oder Header VL-Stream-Fields). Bis zu 6 Felder; Standard ist service,host.
  • Nimm Felder mit wenigen verschiedenen Werten, nach denen du ständig filterst: service, env, namespace, region, host.
  • Nimm nie Werte mit hoher Kardinalität (request_id, pod auf einem vollen Cluster, user_id) – jede eindeutige Kombination ist ein eigener Stream.

Ingest-Optionen

Optionen übergibst du bei jedem Endpoint als Query-Argumente oder, für Agents, die die URL nicht setzen können, als Header. Query-Argumente haben Vorrang.

Query-ArgumentHeaderWirkung
_stream_fieldsVL-Stream-Fieldskommagetrennte Felder, die den Stream bilden (max. 6)
_msg_fieldVL-Msg-Fieldwelcher Key die Nachricht enthält (z. B. message, log, msg)
_time_fieldVL-Time-Fieldwelcher Key den Zeitstempel enthält (z. B. @timestamp, time, ts)
_ignore_fieldsVL-Ignore-FieldsKeys, die vor dem Speichern verworfen werden
_extra_fieldsVL-Extra-Fieldskonstante Felder, die hinzugefügt werden, k1=v1,k2=v2
_default_msg_valueVL-Default-Msg-ValueNachricht für Einträge ohne eigene Nachricht

Der Klartext-Endpoint kennt zusätzlich _time_source=ingest und _multiline=off und behandelt jedes Query-Argument ohne Unterstrich als konstantes Feld.

Limits, Kontingent, Aufbewahrung

LimitWert
Request-Body16 MiB unkomprimiert; gzip wird akzeptiert
Stream-Felder6 pro Request
Monatliches Volumenje nach Plan, gemessen in unkomprimierten Bytes, wie sie ankommen; auf der Logs-Seite angezeigt
Aufbewahrungje nach Plan; ältere Einträge werden automatisch entfernt, und der Suchzeitraum ist darauf begrenzt
Kontingent aufgebraucht429 Too Many Requests mit einem Retry-After-Header, bis der Monat wechselt; der Batch, der die Grenze überschreitet, wird noch angenommen
Hinweis: Agents mit Festplattenpuffer (Vector, Fluent Bit, Alloy) behalten Zeilen, solange dein Kontingent aufgebraucht ist oder du offline bist, und liefern sie später – mit ihren ursprünglichen Zeitstempeln, sodass zeitlich nichts verrutscht.

Response-Codes

StatusBedeutungWas tun
200angenommen (/text antwortet mit {"entries": N})–
400fehlerhaftes JSON, Text ohne Zeilen oder kaputte KompressionPayload korrigieren; der Body nennt die erste fehlerhafte Zeile
401fehlender, fehlerhafter oder unbekannter Ingest-Keyden Authorization-Header prüfen und ob der Key vom Typ Log-Ingest ist
403der Plan enthält keine Logs, oder die Organisation hat noch keinen Log-Tenantupgraden oder zuerst einen Ingest-Key erstellen
413Body über 16 MiBkleinere Batches senden
415nicht unterstütztes Content-Encodinggzip oder keins verwenden
429monatliches Kontingent aufgebrauchtbis Retry-After warten; Agents wiederholen von selbst
502 / 503Speicher oder Key-Abfrage vorübergehend nicht verfügbarmit Backoff erneut versuchen; es wurde nichts angenommen

Integration wählen

Überprüfen

Öffne Logs, wähl den Zeitraum „15 Min.“ und such nach service:=<your service>. Erscheint nichts, schau im Log des Agents nach dem HTTP-Status seiner letzten Anfrage (siehe Tabelle oben) und nach der Zeit: Ein Agent, dessen Uhr um Minuten falsch geht, legt Zeilen außerhalb des 15-Minuten-Fensters ab – probier „24 Std.“.

Weiter geht es mit Logs durchsuchen.

FAQ

Können sich mehrere Services einen Ingest-Key teilen?

Ja. Ein Key identifiziert die Organisation, nicht den Service – unterscheide die Services mit dem Feld service. Getrennte Keys pro Umgebung oder Team erleichtern die Rotation.

Was passiert, wenn ich einen Key widerrufe?

Neue Batches werden innerhalb von etwa 30 Sekunden mit 401 abgelehnt (das Gateway speichert Key-Abfragen kurz zwischen). Bereits angenommene Zeilen bleiben durchsuchbar.

Sind Zeitstempel Pflicht?

Nein. Ohne _time (oder den in _time_field genannten Key) wird die Ankunftszeit verwendet. Schick Zeitstempel mit, wenn du Dateien erneut einspielst oder wenn Agents länger als ein paar Sekunden puffern.

Unterstützt UptimeEye Syslog oder gRPC?

Nicht direkt. Richte einen Syslog-fähigen Agent (Vector, Fluent Bit, Alloy) auf die HTTP-Endpoints. OTLP wird über HTTP/protobuf angenommen, nicht über gRPC.

Was passiert mit meinen Logs, wenn ich die Organisation lösche?

Das Löschen der Organisation stößt das Löschen ihres kompletten Log-Tenants an. Ingest-Keys funktionieren sofort nicht mehr, und die gespeicherten Logdaten werden aus unserem Speicher entfernt – normalerweise innerhalb einer Stunde. Unabhängig davon werden Einträge, die älter als die Aufbewahrungsdauer deines Plans sind, automatisch entfernt.

Verarbeitet der Server die Inhalte?

JSON-Keys werden unverändert als Felder gespeichert (verschachtelte Objekte zu Namen mit Punkten aufgelöst). Der Klartext-Endpoint erkennt zusätzlich einen Zeitstempel am Zeilenanfang und ein Level-Wort. Alles andere – Extraktion per Regex, Zusammenfügen mehrzeiliger Einträge bei JSON-Agents – gehört in die Pipeline deines Agents.