2026-01-09 02:51:11 +01:00
|
|
|
|
---
|
|
|
|
|
|
summary: "Logging overview: file logs, console output, CLI tailing, and the Control UI"
|
|
|
|
|
|
read_when:
|
|
|
|
|
|
- You need a beginner-friendly overview of logging
|
|
|
|
|
|
- You want to configure log levels or formats
|
|
|
|
|
|
- You are troubleshooting and need to find logs quickly
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# Logging
|
|
|
|
|
|
|
|
|
|
|
|
Clawdbot logs in two places:
|
|
|
|
|
|
|
|
|
|
|
|
- **File logs** (JSON lines) written by the Gateway.
|
|
|
|
|
|
- **Console output** shown in terminals and the Control UI.
|
|
|
|
|
|
|
|
|
|
|
|
This page explains where logs live, how to read them, and how to configure log
|
|
|
|
|
|
levels and formats.
|
|
|
|
|
|
|
|
|
|
|
|
## Where logs live
|
|
|
|
|
|
|
|
|
|
|
|
By default, the Gateway writes a rolling log file under:
|
|
|
|
|
|
|
|
|
|
|
|
`/tmp/clawdbot/clawdbot-YYYY-MM-DD.log`
|
|
|
|
|
|
|
|
|
|
|
|
You can override this in `~/.clawdbot/clawdbot.json`:
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"logging": {
|
|
|
|
|
|
"file": "/path/to/clawdbot.log"
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## How to read logs
|
|
|
|
|
|
|
|
|
|
|
|
### CLI: live tail (recommended)
|
|
|
|
|
|
|
|
|
|
|
|
Use the CLI to tail the gateway log file via RPC:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
clawdbot logs --follow
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Output modes:
|
|
|
|
|
|
|
|
|
|
|
|
- **TTY sessions**: pretty, colorized, structured log lines.
|
|
|
|
|
|
- **Non-TTY sessions**: plain text.
|
|
|
|
|
|
- `--json`: line-delimited JSON (one log event per line).
|
|
|
|
|
|
- `--plain`: force plain text in TTY sessions.
|
|
|
|
|
|
- `--no-color`: disable ANSI colors.
|
|
|
|
|
|
|
|
|
|
|
|
In JSON mode, the CLI emits `type`-tagged objects:
|
|
|
|
|
|
|
|
|
|
|
|
- `meta`: stream metadata (file, cursor, size)
|
|
|
|
|
|
- `log`: parsed log entry
|
|
|
|
|
|
- `notice`: truncation / rotation hints
|
|
|
|
|
|
- `raw`: unparsed log line
|
|
|
|
|
|
|
|
|
|
|
|
If the Gateway is unreachable, the CLI prints a short hint to run:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
clawdbot doctor
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Control UI (web)
|
|
|
|
|
|
|
|
|
|
|
|
The Control UI’s **Logs** tab tails the same file using `logs.tail`.
|
|
|
|
|
|
See [/web/control-ui](/web/control-ui) for how to open it.
|
|
|
|
|
|
|
2026-01-13 07:15:57 +00:00
|
|
|
|
### Channel-only logs
|
2026-01-09 02:51:11 +01:00
|
|
|
|
|
2026-01-13 07:15:57 +00:00
|
|
|
|
To filter channel activity (WhatsApp/Telegram/etc), use:
|
2026-01-09 02:51:11 +01:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-01-13 06:16:43 +00:00
|
|
|
|
clawdbot channels logs --channel whatsapp
|
2026-01-09 02:51:11 +01:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Log formats
|
|
|
|
|
|
|
|
|
|
|
|
### File logs (JSONL)
|
|
|
|
|
|
|
|
|
|
|
|
Each line in the log file is a JSON object. The CLI and Control UI parse these
|
|
|
|
|
|
entries to render structured output (time, level, subsystem, message).
|
|
|
|
|
|
|
|
|
|
|
|
### Console output
|
|
|
|
|
|
|
|
|
|
|
|
Console logs are **TTY-aware** and formatted for readability:
|
|
|
|
|
|
|
2026-01-13 06:16:43 +00:00
|
|
|
|
- Subsystem prefixes (e.g. `gateway/channels/whatsapp`)
|
2026-01-09 02:51:11 +01:00
|
|
|
|
- Level coloring (info/warn/error)
|
|
|
|
|
|
- Optional compact or JSON mode
|
|
|
|
|
|
|
|
|
|
|
|
Console formatting is controlled by `logging.consoleStyle`.
|
|
|
|
|
|
|
|
|
|
|
|
## Configuring logging
|
|
|
|
|
|
|
|
|
|
|
|
All logging configuration lives under `logging` in `~/.clawdbot/clawdbot.json`.
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"logging": {
|
|
|
|
|
|
"level": "info",
|
|
|
|
|
|
"file": "/tmp/clawdbot/clawdbot-YYYY-MM-DD.log",
|
|
|
|
|
|
"consoleLevel": "info",
|
|
|
|
|
|
"consoleStyle": "pretty",
|
|
|
|
|
|
"redactSensitive": "tools",
|
|
|
|
|
|
"redactPatterns": [
|
|
|
|
|
|
"sk-.*"
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Log levels
|
|
|
|
|
|
|
|
|
|
|
|
- `logging.level`: **file logs** (JSONL) level.
|
|
|
|
|
|
- `logging.consoleLevel`: **console** verbosity level.
|
|
|
|
|
|
|
|
|
|
|
|
`--verbose` only affects console output; it does not change file log levels.
|
|
|
|
|
|
|
|
|
|
|
|
### Console styles
|
|
|
|
|
|
|
|
|
|
|
|
`logging.consoleStyle`:
|
|
|
|
|
|
|
|
|
|
|
|
- `pretty`: human-friendly, colored, with timestamps.
|
|
|
|
|
|
- `compact`: tighter output (best for long sessions).
|
|
|
|
|
|
- `json`: JSON per line (for log processors).
|
|
|
|
|
|
|
|
|
|
|
|
### Redaction
|
|
|
|
|
|
|
|
|
|
|
|
Tool summaries can redact sensitive tokens before they hit the console:
|
|
|
|
|
|
|
|
|
|
|
|
- `logging.redactSensitive`: `off` | `tools` (default: `tools`)
|
|
|
|
|
|
- `logging.redactPatterns`: list of regex strings to override the default set
|
|
|
|
|
|
|
|
|
|
|
|
Redaction affects **console output only** and does not alter file logs.
|
|
|
|
|
|
|
2026-01-20 18:56:10 +00:00
|
|
|
|
## Diagnostics + OpenTelemetry
|
|
|
|
|
|
|
|
|
|
|
|
Diagnostics are **opt-in** structured events for model runs (usage + cost +
|
|
|
|
|
|
context + duration). They do **not** replace logs; they exist to feed metrics,
|
|
|
|
|
|
traces, and other exporters.
|
|
|
|
|
|
|
|
|
|
|
|
Clawdbot currently emits a `model.usage` event after each agent run with:
|
|
|
|
|
|
|
|
|
|
|
|
- Token counts (input/output/cache/prompt/total)
|
|
|
|
|
|
- Estimated cost (USD)
|
|
|
|
|
|
- Context window used/limit
|
|
|
|
|
|
- Duration (ms)
|
|
|
|
|
|
- Provider/channel/model + session identifiers
|
|
|
|
|
|
|
|
|
|
|
|
### Enable diagnostics (no exporter)
|
|
|
|
|
|
|
|
|
|
|
|
Use this if you want diagnostics events available to plugins or custom sinks:
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"diagnostics": {
|
|
|
|
|
|
"enabled": true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Export to OpenTelemetry
|
|
|
|
|
|
|
|
|
|
|
|
Diagnostics can be exported via the `diagnostics-otel` plugin (OTLP/HTTP). This
|
|
|
|
|
|
works with any OpenTelemetry collector/backend that accepts OTLP/HTTP.
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"plugins": {
|
|
|
|
|
|
"allow": ["diagnostics-otel"],
|
|
|
|
|
|
"entries": {
|
|
|
|
|
|
"diagnostics-otel": {
|
|
|
|
|
|
"enabled": true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"diagnostics": {
|
|
|
|
|
|
"enabled": true,
|
|
|
|
|
|
"otel": {
|
|
|
|
|
|
"enabled": true,
|
|
|
|
|
|
"endpoint": "http://otel-collector:4318",
|
|
|
|
|
|
"protocol": "http/protobuf",
|
|
|
|
|
|
"serviceName": "clawdbot-gateway",
|
|
|
|
|
|
"traces": true,
|
|
|
|
|
|
"metrics": true,
|
|
|
|
|
|
"sampleRate": 0.2,
|
|
|
|
|
|
"flushIntervalMs": 60000
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Notes:
|
|
|
|
|
|
- You can also enable the plugin with `clawdbot plugins enable diagnostics-otel`.
|
|
|
|
|
|
- `protocol` currently supports `http/protobuf`.
|
|
|
|
|
|
- Metrics include token usage, cost, context size, and run duration.
|
|
|
|
|
|
- Traces/metrics can be toggled with `traces` / `metrics` (default: on).
|
|
|
|
|
|
- Set `headers` when your collector requires auth.
|
|
|
|
|
|
- Environment variables supported: `OTEL_EXPORTER_OTLP_ENDPOINT`,
|
|
|
|
|
|
`OTEL_SERVICE_NAME`, `OTEL_EXPORTER_OTLP_PROTOCOL`.
|
|
|
|
|
|
|
2026-01-09 02:51:11 +01:00
|
|
|
|
## Troubleshooting tips
|
|
|
|
|
|
|
|
|
|
|
|
- **Gateway not reachable?** Run `clawdbot doctor` first.
|
|
|
|
|
|
- **Logs empty?** Check that the Gateway is running and writing to the file path
|
|
|
|
|
|
in `logging.file`.
|
|
|
|
|
|
- **Need more detail?** Set `logging.level` to `debug` or `trace` and retry.
|