Logging
OpenClaw loggt an zwei Stellen:
- Datei-Logs (JSON-Zeilen), die vom Gateway geschrieben werden.
- Konsolen-Ausgabe, die in Terminals und der Control UI angezeigt wird.
Diese Seite erklärt, wo Logs gespeichert werden, wie du sie liest und wie du Log-Level und Formate konfigurierst.
Wo Logs gespeichert werden
Standardmäßig schreibt das Gateway eine rollende Log-Datei unter:
/tmp/openclaw/openclaw-YYYY-MM-DD.log
Das Datum verwendet die lokale Zeitzone des Gateway-Hosts.
Du kannst das in ~/.openclaw/openclaw.json überschreiben:
{
"logging": {
"file": "/path/to/openclaw.log"
}
}
Logs lesen
CLI: Live-Tail (empfohlen)
Nutze die CLI, um die Gateway-Log-Datei per RPC zu verfolgen:
openclaw logs --follow
Ausgabe-Modi:
- TTY-Sessions: hübsch formatiert, farbig, strukturierte Log-Zeilen.
- Nicht-TTY-Sessions: Plain Text.
--json: zeilenweise JSON (ein Log-Event pro Zeile).--plain: erzwingt Plain Text in TTY-Sessions.--no-color: deaktiviert ANSI-Farben.
Im JSON-Modus gibt die CLI type-getaggte Objekte aus:
meta: Stream-Metadaten (Datei, Cursor, Größe)log: geparster Log-Eintragnotice: Hinweise zu Kürzung/Rotationraw: ungeparste Log-Zeile
Falls das Gateway nicht erreichbar ist, zeigt die CLI einen kurzen Hinweis, dass du Folgendes ausführen sollst:
openclaw doctor
Control UI (Web)
Der Logs-Tab der Control UI verfolgt dieselbe Datei mit logs.tail.
Siehe /web/control-ui, wie du sie öffnest.
Nur Channel-Logs
Um Channel-Aktivität zu filtern (WhatsApp/Telegram/etc.), nutze:
openclaw channels logs --channel whatsapp
Log-Formate
Datei-Logs (JSONL)
Jede Zeile in der Log-Datei ist ein JSON-Objekt. Die CLI und Control UI parsen diese Einträge, um strukturierte Ausgaben zu rendern (Zeit, Level, Subsystem, Nachricht).
Konsolen-Ausgabe
Konsolen-Logs sind TTY-aware und für Lesbarkeit formatiert:
- Subsystem-Präfixe (z. B.
gateway/channels/whatsapp) - Level-Färbung (info/warn/error)
- Optional kompakter oder JSON-Modus
Die Konsolen-Formatierung wird durch 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: Level für Datei-Logs (JSONL).logging.consoleLevel: Verbosity-Level für die Konsole.
--verbose betrifft nur die Konsolen-Ausgabe; es ändert nicht die Datei-Log-Level.
Konsolen-Styles
logging.consoleStyle:
pretty: benutzerfreundlich, farbig, mit Zeitstempeln.compact: kompaktere Ausgabe (am besten für lange Sessions).json: JSON pro Zeile (für Log-Prozessoren).
Redaction
Tool-Zusammenfassungen können sensible Tokens redaktieren, bevor sie in der Konsole erscheinen:
logging.redactSensitive:off|tools(Standard:tools)logging.redactPatterns: Liste von Regex-Strings, um das Standard-Set zu überschreiben
Redaction betrifft nur die Konsolen-Ausgabe und ändert keine Datei-Logs.
Diagnostics + OpenTelemetry
Diagnostics sind strukturierte, maschinenlesbare Events für Modell-Runs und Message-Flow-Telemetrie (Webhooks, Queueing, Session-State). Sie ersetzen nicht Logs; sie existieren, um Metriken, Traces und andere Exporter zu versorgen.
Diagnostics-Events werden in-process emittiert, aber Exporter werden nur angehängt, wenn Diagnostics + das Exporter-Plugin aktiviert sind.
OpenTelemetry vs OTLP
- OpenTelemetry (OTel): das Datenmodell + SDKs für Traces, Metriken und Logs.
- OTLP: das Wire-Protokoll, um OTel-Daten zu einem Collector/Backend zu exportieren.
- OpenClaw exportiert heute per OTLP/HTTP (protobuf).
Exportierte Signale
- Metriken: Counter + Histogramme (Token-Nutzung, Message-Flow, Queueing).
- Traces: Spans für Modell-Nutzung + Webhook/Message-Processing.
- Logs: über OTLP exportiert, wenn
diagnostics.otel.logsaktiviert ist. Log-Volumen kann hoch sein; behaltelogging.levelund Exporter-Filter im Blick.
Diagnostic-Event-Katalog
Modell-Nutzung:
model.usage: Tokens, Kosten, Dauer, Context, Provider/Modell/Channel, Session-IDs.
Message-Flow:
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-Enqueue + Tiefe.queue.lane.dequeue: Command-Queue-Lane-Dequeue + Wartezeit.session.state: Session-State-Übergang + Grund.session.stuck: Session-Stuck-Warnung + Alter.run.attempt: Run-Retry/Attempt-Metadaten.diagnostic.heartbeat: aggregierte Counter (Webhooks/Queue/Session).
Diagnostics aktivieren (ohne Exporter)
Nutze das, wenn du Diagnostics-Events für Plugins oder Custom-Sinks verfügbar machen willst:
{
"diagnostics": {
"enabled": true
}
}
Diagnostics-Flags (gezielte Logs)
Nutze Flags, um zusätzliche, gezielte Debug-Logs einzuschalten, ohne logging.level zu erhöhen.
Flags sind case-insensitive und unterstützen Wildcards (z. B. telegram.* oder *).
{
"diagnostics": {
"flags": ["telegram.http"]
}
}
Env-Override (einmalig):
OPENCLAW_DIAGNOSTICS=telegram.http,telegram.payload
Hinweise:
- Flag-Logs gehen in die Standard-Log-Datei (dieselbe wie
logging.file). - Die Ausgabe wird weiterhin gemäß
logging.redactSensitiveredaktiert. - Vollständige Anleitung: /diagnostics/flags.
Export zu OpenTelemetry
Diagnostics können per diagnostics-otel-Plugin (OTLP/HTTP) exportiert werden. Das funktioniert mit jedem OpenTelemetry-Collector/Backend, das 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 aktuell nurhttp/protobuf.grpcwird ignoriert.- Metriken umfassen Token-Nutzung, Kosten, Context-Größe, Run-Dauer und Message-Flow-Counter/Histogramme (Webhooks, Queueing, Session-State, Queue-Tiefe/Wartezeit).
- Traces/Metriken können mit
traces/metricsumgeschaltet werden (Standard: an). Traces umfassen Modell-Nutzungs-Spans plus Webhook/Message-Processing-Spans, wenn aktiviert. - Setze
headers, wenn dein Collector Auth benötigt. - Unterstützte Umgebungsvariablen:
OTEL_EXPORTER_OTLP_ENDPOINT,OTEL_SERVICE_NAME,OTEL_EXPORTER_OTLP_PROTOCOL.
Exportierte Metriken (Namen + Typen)
Modell-Nutzung:
openclaw.tokens(Counter, Attrs:openclaw.token,openclaw.channel,openclaw.provider,openclaw.model)openclaw.cost.usd(Counter, Attrs:openclaw.channel,openclaw.provider,openclaw.model)openclaw.run.duration_ms(Histogram, Attrs:openclaw.channel,openclaw.provider,openclaw.model)openclaw.context.tokens(Histogram, Attrs:openclaw.context,openclaw.channel,openclaw.provider,openclaw.model)
Message-Flow:
openclaw.webhook.received(Counter, Attrs:openclaw.channel,openclaw.webhook)openclaw.webhook.error(Counter, Attrs:openclaw.channel,openclaw.webhook)openclaw.webhook.duration_ms(Histogram, Attrs:openclaw.channel,openclaw.webhook)openclaw.message.queued(Counter, Attrs:openclaw.channel,openclaw.source)openclaw.message.processed(Counter, Attrs:openclaw.channel,openclaw.outcome)openclaw.message.duration_ms(Histogram, Attrs:openclaw.channel,openclaw.outcome)
Queues + Sessions:
openclaw.queue.lane.enqueue(Counter, Attrs:openclaw.lane)openclaw.queue.lane.dequeue(Counter, Attrs:openclaw.lane)openclaw.queue.depth(Histogram, Attrs:openclaw.laneoderopenclaw.channel=heartbeat)openclaw.queue.wait_ms(Histogram, Attrs:openclaw.lane)openclaw.session.state(Counter, Attrs:openclaw.state,openclaw.reason)openclaw.session.stuck(Counter, Attrs:openclaw.state)openclaw.session.stuck_age_ms(Histogram, Attrs:openclaw.state)openclaw.run.attempt(Counter, Attrs:openclaw.attempt)
Exportierte Spans (Namen + wichtige Attribute)
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-Endpoints können per
diagnostics.otel.endpointoderOTEL_EXPORTER_OTLP_ENDPOINTgesetzt werden. - Falls der Endpoint bereits
/v1/tracesoder/v1/metricsenthält, wird er unverändert verwendet. - Falls der Endpoint bereits
/v1/logsenthält, wird er unverändert für Logs verwendet. diagnostics.otel.logsaktiviert OTLP-Log-Export für die Haupt-Logger-Ausgabe.
Log-Export-Verhalten
- OTLP-Logs verwenden dieselben strukturierten Records, die in
logging.filegeschrieben werden. - Respektiert
logging.level(Datei-Log-Level). Konsolen-Redaction gilt nicht für OTLP-Logs. - High-Volume-Installationen sollten OTLP-Collector-Sampling/Filtering bevorzugen.
Troubleshooting-Tipps
- 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 versuch es erneut.