Logs durchsuchen

Meist brauchst du nicht mehr als ein Wort, einen Feldfilter und einen Zeitraum. Diese Seite geht die Logs-Seite von oben nach unten durch und zeigt dann alles, was das Suchfeld versteht.

Die Logs-Seite

Von oben nach unten:

  • Abfrage-Editor – tippe LogsQL und drück Enter, um zu suchen (Shift+Enter für eine neue Zeile). Solange er leer ist, siehst du die Beispiele unter „Schnellstart“; das ? öffnet die Suchsyntax.
  • Zeitraum – die Voreinstellungen 15 Min. / 1 Std. / 24 Std. / 7 Tage und ein eigener Zeitraum auf die Sekunde genau.
  • Histogramm – das Volumen im gewählten Zeitraum. Die Statuszeile darunter zeigt die Zahl der geladenen Zeilen, die Aufbewahrungsdauer deines Plans und das in diesem Monat verbrauchte Volumen.
  • Felder (links) – oben deine aktiven Filter, darunter die Stream-Felder und alle weiteren Felder des aktuellen Ergebnisses, mit Werten und Anzahl. Klick auf einen Wert, um danach zu filtern, und noch einmal (oder auf das × in der Liste der aktiven Filter), um den Filter wieder zu entfernen.
  • Ergebnisliste – neueste zuerst, virtualisiert, lädt beim Scrollen nach. Klick auf eine Zeile für die Detailansicht.
  • Werkzeugleiste – Download, Anzeige (Spalten, Gruppieren nach, Zeilen pro Seite) und Live-Tail.

Wörter und Phrasen

Tipp ein Wort, und du bekommst jede Zeile, die es enthält, in der Nachricht oder in einem beliebigen Feld. Wörter passen unabhängig von Groß- und Kleinschreibung und nur als ganze Wörter.

  • timeoutJede Zeile mit dem Wort timeout.
  • timeout paymentsBeide Wörter, irgendwo in der Zeile (ein implizites AND).
  • "upstream timeout"Genau diese Phrase, in dieser Reihenfolge.
  • err*Präfix-Treffer: error, errno, errors …
  • *Alles im Zeitraum.

Feldfilter

Jeder JSON-Key, den du sendest, wird zu einem Feld. Darauf filterst du mit field:value. Achte auf den Doppelpunkt – service=api ist kein LogsQL; das Suchfeld schlägt die korrigierte Form vor.

  • level:errorDas Feld level enthält das Wort error.
  • service:=apiDas Feld service ist genau api (unterscheidet Groß- und Kleinschreibung).
  • service:="checkout svc"Exakter Treffer mit Leerzeichen oder Sonderzeichen – setz den Wert in Anführungszeichen.
  • host:node-*Präfix-Treffer auf einem Feld.
  • path:~"^/api/v[12]/"Regulärer Ausdruck auf einem Feld.
  • user_id:*Zeilen, die das Feld überhaupt haben, egal mit welchem Wert.
  • _msg:checkoutNur die Nachricht durchsuchen, nicht die anderen Felder.
  • kubernetes.namespace_name:=paymentsVerschachtelte Keys sind Namen mit Punkten.

Abfrage und Filter

Gesucht wird mit zweierlei zusammen: dem LogsQL, das du in den Editor getippt hast, und den Feldfiltern, die du im Bereich „Felder“ gewählt hast. Die Filter werden nicht in den Editor geschrieben – sie stehen angehakt im Bereich und werden bei der Suche mit deiner Abfrage kombiniert. Die Regeln:

  • Ein Klick auf einen Wert im Bereich „Felder“, auf ein Feld im Detail einer Zeile oder auf die Service-Spalte fügt einen Filter field = value hinzu und startet die Suche sofort neu.
  • Mehrere Werte desselben Felds werden mit OR verknüpft (intern level:in(error, warn)); Filter auf verschiedenen Feldern schränken sich gegenseitig ein (AND); dein Freitext bleibt, wie er ist.
  • Der Bereich zeigt die aktiven Filter oben. Klick auf einen angehakten Wert oder auf das × in dieser Liste, um einen zu entfernen, oder auf Alle entfernen, um alle zu verwerfen.
  • Der Bereich berechnet die Werte eines Felds ohne die Filter auf genau diesem Feld, damit die anderen Werte sichtbar bleiben und du die Auswahl erweitern kannst.
  • Abfrage, Filter und Zeitraum stehen in der URL der Seite, also bleiben sie beim Neuladen erhalten, und du kannst den Link teilen. Alles, was ein Filter nicht ausdrücken kann – Ausschlüsse, reguläre Ausdrücke, Bereiche –, gehört in die Abfrage.

Ausschließen und kombinieren in der Abfrage

  • -level:debugAlles außer Debug-Zeilen.
  • level:error OR level:warnEins von beiden.
  • service:=api AND NOT path:/healthExplizites AND / NOT.
  • (level:error OR level:warn) team:=paymentsKlammern gruppieren Bedingungen.
  • level:in(error, fatal, critical)Einer von mehreren Werten.
  • _stream:{service="api",env="prod"}Der schnellste Filter: ein exakter Stream.

Zahlen und Bereiche

Numerische Felder (Dauern, Größen, Statuscodes) lassen sich vergleichen und auf Bereiche einschränken.

  • duration_ms:>500Größer als.
  • status:>=500 status:<600Dazwischen – zwei Filter werden mit AND kombiniert.
  • status:range(500, 599)Dasselbe als Bereich.
  • bytes:>1MiBEinheiten werden verstanden: KiB, MiB, GiB und Dauern wie 1.5s oder 200ms.
  • ip:ipv4_range(10.0.0.0/8)IP-Bereiche.

Zeiträume

Die Voreinstellungen 15 Min. / 1 Std. / 24 Std. / 7 Tage setzen das Fenster relativ zu jetzt. Eigener Zeitraum öffnet einen Kalender mit Zeitfeldern bis auf die Sekunde – der übliche Weg, wenn ein Alert einen Zeitpunkt nennt. Die Aufbewahrungsdauer deines Plans ist die äußere Grenze. Ergebnisse kommen immer neueste zuerst.

  • _time:5mNur die letzten 5 Minuten, unabhängig von der Voreinstellung.
  • _time:[2026-09-01, 2026-09-02]Ein expliziter Tagesbereich (UTC) in der Abfrage.
Hinweis: Geblättert wird per Offset: Die Liste lädt eine Seite (standardmäßig 100 Zeilen, einstellbar unter Anzeige) und holt beim Scrollen die nächste. Die Statuszeile zählt die geladenen Zeilen und sagt, wenn alles geladen ist. Ab ein paar tausend Zeilen schränkst du die Abfrage meist besser ein.

Zeilendetail und Kontext

Klick auf eine Zeile, um sie aufzuklappen. Das Detail zeigt jedes Feld des Eintrags mit zwei Aktionen pro Feld:

  • Filter-Symbol – hängt field:=value an die Abfrage an. Ein Klick auf einen Service-Namen in der Liste tut dasselbe für service.
  • JSON kopieren – der Roh-Eintrag.

Kontext um eine Zeile

Die Kontext-Buttons (±1s, ±10s, ±1m, ±5m) ersetzen die aktuelle Suche durch denselben Stream – _stream:{...} dieser Zeile – und ein Zeitfenster um sie herum. Die Ankerzeile bleibt hervorgehoben, so liest du, was direkt davor und danach passiert ist, ohne die Abfrage dafür zu kennen. Mit der Zurück-Taste des Browsers oder den Voreinstellungen kommst du zurück.

Live-Tail

Live-Tail streamt neue Zeilen, die zu deiner Abfrage passen, sobald sie eintreffen. Er läuft etwa sechs Sekunden hinter der Echtzeit, damit Agents, die in Batches senden, in der richtigen Reihenfolge liefern können, folgt den Zeitstempeln der Ereignisse und behält die neuesten 500 Zeilen im Blick. Eine Zeile mit einem Zeitstempel in der Vergangenheit – nachgeliefert, aus einer erneut eingespielten Datei – erscheint in der Suche, nicht im Tail.

Anzeige, Gruppierung, Download

  • Anzeige (Regler-Symbol): Zeilen pro Seite 50/100/200/500, welche Spalten zu sehen sind, zusätzliche Felder, die als key=value neben der Nachricht stehen, und Gruppieren nach einem Feld – die Liste bekommt dann eine Kopfzeile pro Wert, praktisch für service oder host.
  • Diese Einstellungen gehören dir und werden im Browser gespeichert; sie sind nicht Teil eines geteilten Links.
  • Download exportiert die gerade geladenen Zeilen als NDJSON oder CSV – schränk zuerst die Abfrage ein und lade dann, was du brauchst.
  • Klartext-Einträge (aus /v1/ingest/text) behalten die ganze ursprüngliche Zeile als Nachricht; mehrzeilige Stacktraces erscheinen als ein Block.

Eine Suche teilen

Der Suchzustand steht in der URL, also bleibt er beim Neuladen erhalten, und ein kopierter Link zeigt deinen Kolleg:innen genau dieselbe Suche:

ParameterBedeutung
qdie Freitext-Abfrage
rangeeine Voreinstellung (15m, 24h, 7d); fehlt beim Standard 1h
from / toein eigener Zeitraum als ISO-Zeitstempel; wird statt range verwendet
Beispiel
https://app.uptimeeye.com/<org>/logs?q=timeout+service%3A%3Dcheckout+level%3A%3Derror&range=24h

Voreinstellungen bleiben relativ („die letzten 24 Std.“, wenn der Link geöffnet wird); ein eigener Zeitraum ist absolut – genau richtig für Links während eines Incidents.

Woher Felder kommen

Es gibt kein Schema. Jedes JSON, das du sendest, wird unverändert gespeichert: {"_msg":"…","service":"api","env":"prod","user_id":"u_42"} ergibt die Felder service, env und user_id. Drei Felder sind besonders:

  • _msg – die Nachricht. Agents legen mit _msg_field fest, welcher ihrer Keys die Nachricht ist.
  • _time – die Ereigniszeit; standardmäßig der Zeitpunkt des Ingests.
  • _stream – die mit _stream_fields gewählten Stream-Labels (zum Beispiel service,env). Filter auf Stream-Feldern sind die schnellsten Filter überhaupt, wähl also Felder mit wenigen verschiedenen Werten.

Wie du Felder schon beim Senden formst, steht in Logs senden.

Aggregationen mit Pipes

Das Suchfeld akzeptiert die komplette Sprache LogsQL, auch Pipes. Die Logs-Seite ist für Zeilen gebaut, deshalb kommen Aggregationen als Zeilen zurück, deren Felder die berechneten Werte sind – öffne eine Zeile, um sie zu sehen, oder lade das Ergebnis herunter.

  • level:error | stats by (service) count()Fehler pro Service im Zeitraum.
  • _stream:{service="api"} | stats quantile(0.99, duration_ms) p99Ein Perzentil über ein numerisches Feld.
  • * | top 10 by (path)Die häufigsten Werte eines Felds.
  • _msg:~"order=(?P<order>\d+)" | extract "order=<order>" | stats by (order) count()Einen Wert aus der Nachricht extrahieren und danach zählen.

Die vollständige Referenz ist die LogsQL-Doku.

Kurzreferenz

AbfrageBedeutung
wordZeile enthält das Wort
"exact phrase"Phrase in dieser Reihenfolge
field:valueFeld enthält das Wort
field:=valueFeld ist gleich dem Wert
field:prefix*Feld beginnt mit
-field:valueausschließen
a OR beins von beiden
field:>10numerischer Vergleich
field:range(1, 9)numerischer Bereich
field:in(a, b)einer von mehreren
field:*Feld vorhanden
_stream:{k="v"}exakter Stream
_time:15mletzte 15 Minuten
… | stats by (f) count()aggregieren

FAQ

Unterscheidet die Suche Groß- und Kleinschreibung?

Die Wortsuche (timeout, level:error) ignoriert Groß- und Kleinschreibung. Exakte Treffer (service:=API) und reguläre Ausdrücke unterscheiden sie.

Warum funktioniert service=api nicht?

LogsQL nutzt einen Doppelpunkt: service:api (enthält das Wort) oder service:=api (ist gleich). Das Suchfeld erkennt die Form mit = und schlägt die korrigierte Abfrage vor.

Wie weit zurück kann ich suchen?

So weit, wie dein Plan Logs aufbewahrt – die Logs-Seite zeigt das in der Statuszeile („Dein Plan behält Logs N Tage.“). Ältere Zeilen werden automatisch entfernt.

Kann ich über mehrere Organisationen hinweg suchen?

Nein. Logs sind pro Organisation getrennt; wechsle die Organisation in der Seitenleiste, um eine andere zu durchsuchen.

Warum erscheinen nachgelieferte Zeilen nicht im Live-Tail?

Der Tail folgt der Ereigniszeit (_time). Eine Zeile, deren Zeitstempel beim Eintreffen schon älter als ein paar Sekunden ist – eine erneut eingespielte Datei, ein verspäteter Batch –, ist sofort durchsuchbar, wird aber nicht in den Tail gestreamt.

Begriffe von oben: Ein Filter ist eine Auswahl field = value aus dem Bereich „Felder“; ein Stream ist die Menge der Zeilen mit denselben Werten der Stream-Felder.