Logging
OpenClaw protokolliert an zwei Stellen:
- Datei-Logs (JSON-Zeilen), geschrieben vom Gateway.
- Konsolenausgabe in Terminals und im Control UI.
Diese Seite erklärt, wo Logs liegen, wie du sie liest und wie du Log-Level und Formate konfigurierst.
Wo Logs liegen
Standardmäßig schreibt das Gateway eine rotierende Logdatei unter:
/tmp/openclaw/openclaw-YYYY-MM-DD.log
Das Datum verwendet die lokale Zeitzone des Gateway-Hosts.
Du kannst den Pfad in ~/.openclaw/openclaw.json überschreiben:
{
"logging": {
"file": "/path/to/openclaw.log"
}
}
Logs lesen
CLI: Live-Tailing (empfohlen)
Verwende die CLI, um die Gateway-Logdatei per RPC zu tailen:
openclaw logs --follow
Ausgabemodi:
- TTY-Sessions: hübsch, farbig, strukturierte Log-Zeilen.
- Nicht-TTY-Sessions: Klartext.
--json: zeilenweises JSON (ein Log-Event pro Zeile).--plain: Klartext in TTY-Sessions erzwingen.--no-color: ANSI-Farben deaktivieren.
Im JSON-Modus gibt die CLI type-markierte Objekte aus:
meta: Stream-Metadaten (Datei, Cursor, Größe)log: geparster Log-Eintragnotice: Trunkierungs-/Rotationshinweiseraw: ungeparste Log-Zeile
Wenn das Gateway nicht erreichbar ist, gibt die CLI einen kurzen Hinweis aus:
openclaw doctor
Control UI (Web)
Der Logs-Tab im Control UI tailt dieselbe Datei über logs.tail.
Siehe /web/control-ui für die Anleitung zum Öffnen.
Channel-spezifische Logs
Um Channel-Aktivitäten (WhatsApp/Telegram/etc.) zu filtern:
openclaw channels logs --channel whatsapp
Log-Formate
Datei-Logs (JSONL)
Jede Zeile in der Logdatei ist ein JSON-Objekt. CLI und Control UI parsen diese Einträge, um strukturierte Ausgabe darzustellen (Zeit, Level, Subsystem, Nachricht).
Konsolenausgabe
Konsolen-Logs sind TTY-aware und für Lesbarkeit formatiert:
- Subsystem-Prefixe (z. B.
gateway/channels/whatsapp) - Level-Farbgebung (info/warn/error)
- Optionaler kompakter oder JSON-Modus
Die Konsolenformatierung wird über logging.consoleStyle gesteuert.
Logging konfigurieren
Die gesamte Logging-Konfiguration liegt unter logging in ~/.openclaw/openclaw.json.
{
"logging": {
"level": "info",
"file": "/tmp/openclaw/openclaw-YYYY-MM-DD.log",
"consoleLevel": "info",
"consoleStyle": "pretty",
"redactSensitive": "tools",
"redactPatterns": ["sk-.*"]
}
}
Log-Level
logging.level: Datei-Log-Level (JSONL).logging.consoleLevel: Konsolen-Verbositätslevel.
Beide lassen sich über die Umgebungsvariable OPENCLAW_LOG_LEVEL überschreiben (z. B. OPENCLAW_LOG_LEVEL=debug). Die Umgebungsvariable hat Vorrang vor der Konfigurationsdatei, sodass du die Verbosität für einen einzelnen Lauf erhöhen kannst, ohne openclaw.json zu bearbeiten. Du kannst auch die globale CLI-Option --log-level <level> verwenden (z. B. openclaw --log-level debug gateway run), die wiederum die Umgebungsvariable für diesen Befehl überschreibt.
--verbose beeinflusst nur die Konsolenausgabe; es ändert nicht die Datei-Log-Level.
Konsolen-Stile
logging.consoleStyle:
pretty: benutzerfreundlich, farbig, mit Zeitstempeln.compact: kompaktere Ausgabe (ideal für lange Sessions).json: JSON pro Zeile (für Log-Prozessoren).
Schwärzung
Tool-Zusammenfassungen können sensible Tokens schwärzen, bevor sie in der Konsole angezeigt werden:
logging.redactSensitive:off|tools(Standard:tools)logging.redactPatterns: Liste von Regex-Strings, die den Standardsatz überschreiben
Die Schwärzung betrifft nur die Konsolenausgabe und verändert keine Datei-Logs.
Diagnostics + OpenTelemetry
Diagnostics sind strukturierte, maschinenlesbare Events für Modellläufe und Nachrichtenfluss-Telemetrie (Webhooks, Queuing, Session-Status). Sie ersetzen nicht die Logs; sie dienen dazu, Metriken, Traces und andere Exporter zu speisen.
Diagnostics-Events werden im Prozess emittiert, aber Exporter werden nur angehängt, wenn Diagnostics und das Exporter-Plugin aktiviert sind.
OpenTelemetry vs. OTLP
- OpenTelemetry (OTel): das Datenmodell + SDKs für Traces, Metriken und Logs.
- OTLP: das Übertragungsprotokoll zum Export von OTel-Daten an einen Collector/Backend.
- OpenClaw exportiert derzeit via OTLP/HTTP (protobuf).
Exportierte Signale
- Metriken: Counter + Histogramme (Token-Nutzung, Nachrichtenfluss, Queuing).
- Traces: Spans für Modellnutzung + Webhook-/Nachrichtenverarbeitung.
- Logs: über OTLP exportiert, wenn
diagnostics.otel.logsaktiviert ist. Das Log-Volumen kann hoch sein; beachtelogging.levelund Exporter-Filter.
Diagnostics-Event-Katalog
Modellnutzung:
model.usage: Tokens, Kosten, Dauer, Kontext, Provider/Modell/Channel, Session-IDs.
Nachrichtenfluss:
webhook.received: Webhook-Eingang pro Channel.webhook.processed: Webhook verarbeitet + Dauer.webhook.error: Webhook-Handler-Fehler.message.queued: Nachricht zur Verarbeitung eingereiht.message.processed: Ergebnis + Dauer + optionaler Fehler.
Queue + Session:
queue.lane.enqueue: Command-Queue-Lane-Einreihung + Tiefe.queue.lane.dequeue: Command-Queue-Lane-Entnahme + Wartezeit.session.state: Session-Statusübergang + Grund.session.stuck: Session-Stuck-Warnung + Alter.run.attempt: Run-Retry/Attempt-Metadaten.diagnostic.heartbeat: aggregierte Zähler (Webhooks/Queue/Session).
Diagnostics aktivieren (ohne Exporter)
Verwende dies, wenn du Diagnostics-Events für Plugins oder eigene Sinks verfügbar machen willst:
{
"diagnostics": {
"enabled": true
}
}
Diagnostics-Flags (gezielte Logs)
Verwende Flags, um gezielte Debug-Logs zu aktivieren, ohne logging.level zu erhöhen. Flags sind case-insensitive und unterstützen Wildcards (z. B. telegram.* oder *).
{
"diagnostics": {
"flags": ["telegram.http"]
}
}
Umgebungsvariablen-Override (einmalig):
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload
Hinweise:
- Flag-Logs gehen in die Standard-Logdatei (wie
logging.file). - Die Ausgabe wird gemäß
logging.redactSensitivegeschwärzt. - Vollständige Anleitung: /diagnostics/flags.
Export nach OpenTelemetry
Diagnostics können über das diagnostics-otel-Plugin (OTLP/HTTP) exportiert werden. Das funktioniert mit jedem OpenTelemetry-Collector/Backend, der OTLP/HTTP akzeptiert.
{
"plugins": {
"allow": ["diagnostics-otel"],
"entries": {
"diagnostics-otel": {
"enabled": true
}
}
},
"diagnostics": {
"enabled": true,
"otel": {
"enabled": true,
"endpoint": "http://otel-collector:4318",
"protocol": "http/protobuf",
"serviceName": "openclaw-gateway",
"traces": true,
"metrics": true,
"logs": true,
"sampleRate": 0.2,
"flushIntervalMs": 60000
}
}
}
Hinweise:
- Du kannst das Plugin auch mit
openclaw plugins enable diagnostics-otelaktivieren. protocolunterstützt derzeit nurhttp/protobuf.grpcwird ignoriert.- Metriken umfassen Token-Nutzung, Kosten, Kontextgröße, Run-Dauer und Nachrichtenfluss-Counter/Histogramme (Webhooks, Queuing, Session-Status, Queue-Tiefe/-Wartezeit).
- Traces/Metriken können mit
traces/metricsumgeschaltet werden (Standard: an). Traces umfassen Modellnutzungs-Spans plus Webhook-/Nachrichtenverarbeitungs-Spans, wenn aktiviert. - Setze
headers, wenn dein Collector Authentifizierung verlangt. - Unterstützte Umgebungsvariablen:
OTEL_EXPORTER_OTLP_ENDPOINT,OTEL_SERVICE_NAME,OTEL_EXPORTER_OTLP_PROTOCOL.
Exportierte Metriken (Namen + Typen)
Modellnutzung:
openclaw.tokens(Counter, Attribute:openclaw.token,openclaw.channel,openclaw.provider,openclaw.model)openclaw.cost.usd(Counter, Attribute:openclaw.channel,openclaw.provider,openclaw.model)openclaw.run.duration_ms(Histogramm, Attribute:openclaw.channel,openclaw.provider,openclaw.model)openclaw.context.tokens(Histogramm, Attribute:openclaw.context,openclaw.channel,openclaw.provider,openclaw.model)
Nachrichtenfluss:
openclaw.webhook.received(Counter, Attribute:openclaw.channel,openclaw.webhook)openclaw.webhook.error(Counter, Attribute:openclaw.channel,openclaw.webhook)openclaw.webhook.duration_ms(Histogramm, Attribute:openclaw.channel,openclaw.webhook)openclaw.message.queued(Counter, Attribute:openclaw.channel,openclaw.source)openclaw.message.processed(Counter, Attribute:openclaw.channel,openclaw.outcome)openclaw.message.duration_ms(Histogramm, Attribute:openclaw.channel,openclaw.outcome)
Queues + Sessions:
openclaw.queue.lane.enqueue(Counter, Attribute:openclaw.lane)openclaw.queue.lane.dequeue(Counter, Attribute:openclaw.lane)openclaw.queue.depth(Histogramm, Attribute:openclaw.laneoderopenclaw.channel=heartbeat)openclaw.queue.wait_ms(Histogramm, Attribute:openclaw.lane)openclaw.session.state(Counter, Attribute:openclaw.state,openclaw.reason)openclaw.session.stuck(Counter, Attribute:openclaw.state)openclaw.session.stuck_age_ms(Histogramm, Attribute:openclaw.state)openclaw.run.attempt(Counter, Attribute:openclaw.attempt)
Exportierte Spans (Namen + Schlüsselattribute)
openclaw.model.usageopenclaw.channel,openclaw.provider,openclaw.modelopenclaw.sessionKey,openclaw.sessionIdopenclaw.tokens.*(input/output/cache_read/cache_write/total)
openclaw.webhook.processedopenclaw.channel,openclaw.webhook,openclaw.chatId
openclaw.webhook.erroropenclaw.channel,openclaw.webhook,openclaw.chatId,openclaw.error
openclaw.message.processedopenclaw.channel,openclaw.outcome,openclaw.chatId,openclaw.messageId,openclaw.sessionKey,openclaw.sessionId,openclaw.reason
openclaw.session.stuckopenclaw.state,openclaw.ageMs,openclaw.queueDepth,openclaw.sessionKey,openclaw.sessionId
Sampling + Flushing
- Trace-Sampling:
diagnostics.otel.sampleRate(0.0–1.0, nur Root-Spans). - Metrik-Export-Intervall:
diagnostics.otel.flushIntervalMs(min. 1000ms).
Protokoll-Hinweise
- OTLP/HTTP-Endpunkte können über
diagnostics.otel.endpointoderOTEL_EXPORTER_OTLP_ENDPOINTgesetzt werden. - Wenn der Endpunkt bereits
/v1/tracesoder/v1/metricsenthält, wird er unverändert verwendet. - Wenn der Endpunkt bereits
/v1/logsenthält, wird er unverändert für Logs verwendet. diagnostics.otel.logsaktiviert den OTLP-Log-Export für die Hauptlogger-Ausgabe.
Log-Export-Verhalten
- OTLP-Logs verwenden dieselben strukturierten Datensätze, die in
logging.filegeschrieben werden. - Sie respektieren
logging.level(Datei-Log-Level). Die Konsolen-Schwärzung gilt nicht für OTLP-Logs. - Installationen mit hohem Volumen sollten Sampling/Filtering im OTLP-Collector bevorzugen.
Tipps zur Fehlerbehebung
- Gateway nicht erreichbar? Führe zuerst
openclaw doctoraus. - Logs leer? Prüfe, ob das Gateway läuft und in den Dateipfad unter
logging.fileschreibt. - Mehr Details nötig? Setze
logging.levelaufdebugodertraceund versuche es erneut.