Logging
このコンテンツはまだ日本語訳がありません。
Logging
Section titled “Logging”CoderClaw (built on CoderClaw) 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
Section titled “Where logs live”By default, the Gateway writes a rolling log file under:
/tmp/coderclaw/coderclaw-YYYY-MM-DD.log
The date uses the gateway host’s local timezone.
You can override this in ~/.coderclaw/coderclaw.json:
{ "logging": { "file": "/path/to/coderclaw.log" }}How to read logs
Section titled “How to read logs”CLI: live tail (recommended)
Section titled “CLI: live tail (recommended)”Use the CLI to tail the gateway log file via RPC:
coderclaw logs --followOutput 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 entrynotice: truncation / rotation hintsraw: unparsed log line
If the Gateway is unreachable, the CLI prints a short hint to run:
coderclaw doctorControl UI (web)
Section titled “Control UI (web)”The Control UI’s Logs tab tails the same file using logs.tail.
See /web/control-ui for how to open it.
Channel-only logs
Section titled “Channel-only logs”To filter channel activity (WhatsApp/Telegram/etc), use:
coderclaw channels logs --channel whatsappLog formats
Section titled “Log formats”File logs (JSONL)
Section titled “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
Section titled “Console output”Console logs are TTY-aware and formatted for readability:
- Subsystem prefixes (e.g.
gateway/channels/whatsapp) - Level coloring (info/warn/error)
- Optional compact or JSON mode
Console formatting is controlled by logging.consoleStyle.
Configuring logging
Section titled “Configuring logging”All logging configuration lives under logging in ~/.coderclaw/coderclaw.json.
{ "logging": { "level": "info", "file": "/tmp/coderclaw/coderclaw-YYYY-MM-DD.log", "consoleLevel": "info", "consoleStyle": "pretty", "redactSensitive": "tools", "redactPatterns": ["sk-.*"] }}Log levels
Section titled “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
Section titled “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
Section titled “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.
Diagnostics + OpenTelemetry
Section titled “Diagnostics + OpenTelemetry”Diagnostics are structured, machine-readable events for model runs and message-flow telemetry (webhooks, queueing, session state). They do not replace logs; they exist to feed metrics, traces, and other exporters.
Diagnostics events are emitted in-process, but exporters only attach when diagnostics + the exporter plugin are enabled.
OpenTelemetry vs OTLP
Section titled “OpenTelemetry vs OTLP”- OpenTelemetry (OTel): the data model + SDKs for traces, metrics, and logs.
- OTLP: the wire protocol used to export OTel data to a collector/backend.
- CoderClaw exports via OTLP/HTTP (protobuf) today.
Signals exported
Section titled “Signals exported”- Metrics: counters + histograms (token usage, message flow, queueing).
- Traces: spans for model usage + webhook/message processing.
- Logs: exported over OTLP when
diagnostics.otel.logsis enabled. Log volume can be high; keeplogging.leveland exporter filters in mind.
Diagnostic event catalog
Section titled “Diagnostic event catalog”Model usage:
model.usage: tokens, cost, duration, context, provider/model/channel, session ids.
Message flow:
webhook.received: webhook ingress per channel.webhook.processed: webhook handled + duration.webhook.error: webhook handler errors.message.queued: message enqueued for processing.message.processed: outcome + duration + optional error.
Queue + session:
queue.lane.enqueue: command queue lane enqueue + depth.queue.lane.dequeue: command queue lane dequeue + wait time.session.state: session state transition + reason.session.stuck: session stuck warning + age.run.attempt: run retry/attempt metadata.diagnostic.heartbeat: aggregate counters (webhooks/queue/session).
Enable diagnostics (no exporter)
Section titled “Enable diagnostics (no exporter)”Use this if you want diagnostics events available to plugins or custom sinks:
{ "diagnostics": { "enabled": true }}Diagnostics flags (targeted logs)
Section titled “Diagnostics flags (targeted logs)”Use flags to turn on extra, targeted debug logs without raising logging.level.
Flags are case-insensitive and support wildcards (e.g. telegram.* or *).
{ "diagnostics": { "flags": ["telegram.http"] }}Env override (one-off):
CODERCLAW_DIAGNOSTICS=telegram.http,telegram.payloadNotes:
- Flag logs go to the standard log file (same as
logging.file). - Output is still redacted according to
logging.redactSensitive. - Full guide: /diagnostics/flags.
Export to OpenTelemetry
Section titled “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.
{ "plugins": { "allow": ["diagnostics-otel"], "entries": { "diagnostics-otel": { "enabled": true } } }, "diagnostics": { "enabled": true, "otel": { "enabled": true, "endpoint": "http://otel-collector:4318", "protocol": "http/protobuf", "serviceName": "coderclaw-gateway", "traces": true, "metrics": true, "logs": true, "sampleRate": 0.2, "flushIntervalMs": 60000 } }}Notes:
- You can also enable the plugin with
coderclaw plugins enable diagnostics-otel. protocolcurrently supportshttp/protobufonly.grpcis ignored.- Metrics include token usage, cost, context size, run duration, and message-flow counters/histograms (webhooks, queueing, session state, queue depth/wait).
- Traces/metrics can be toggled with
traces/metrics(default: on). Traces include model usage spans plus webhook/message processing spans when enabled. - Set
headerswhen your collector requires auth. - Environment variables supported:
OTEL_EXPORTER_OTLP_ENDPOINT,OTEL_SERVICE_NAME,OTEL_EXPORTER_OTLP_PROTOCOL.
Exported metrics (names + types)
Section titled “Exported metrics (names + types)”Model usage:
coderclaw.tokens(counter, attrs:coderclaw.token,coderclaw.channel,coderclaw.provider,coderclaw.model)coderclaw.cost.usd(counter, attrs:coderclaw.channel,coderclaw.provider,coderclaw.model)coderclaw.run.duration_ms(histogram, attrs:coderclaw.channel,coderclaw.provider,coderclaw.model)coderclaw.context.tokens(histogram, attrs:coderclaw.context,coderclaw.channel,coderclaw.provider,coderclaw.model)
Message flow:
coderclaw.webhook.received(counter, attrs:coderclaw.channel,coderclaw.webhook)coderclaw.webhook.error(counter, attrs:coderclaw.channel,coderclaw.webhook)coderclaw.webhook.duration_ms(histogram, attrs:coderclaw.channel,coderclaw.webhook)coderclaw.message.queued(counter, attrs:coderclaw.channel,coderclaw.source)coderclaw.message.processed(counter, attrs:coderclaw.channel,coderclaw.outcome)coderclaw.message.duration_ms(histogram, attrs:coderclaw.channel,coderclaw.outcome)
Queues + sessions:
coderclaw.queue.lane.enqueue(counter, attrs:coderclaw.lane)coderclaw.queue.lane.dequeue(counter, attrs:coderclaw.lane)coderclaw.queue.depth(histogram, attrs:coderclaw.laneorcoderclaw.channel=heartbeat)coderclaw.queue.wait_ms(histogram, attrs:coderclaw.lane)coderclaw.session.state(counter, attrs:coderclaw.state,coderclaw.reason)coderclaw.session.stuck(counter, attrs:coderclaw.state)coderclaw.session.stuck_age_ms(histogram, attrs:coderclaw.state)coderclaw.run.attempt(counter, attrs:coderclaw.attempt)
Exported spans (names + key attributes)
Section titled “Exported spans (names + key attributes)”coderclaw.model.usagecoderclaw.channel,coderclaw.provider,coderclaw.modelcoderclaw.sessionKey,coderclaw.sessionIdcoderclaw.tokens.*(input/output/cache_read/cache_write/total)
coderclaw.webhook.processedcoderclaw.channel,coderclaw.webhook,coderclaw.chatId
coderclaw.webhook.errorcoderclaw.channel,coderclaw.webhook,coderclaw.chatId,coderclaw.error
coderclaw.message.processedcoderclaw.channel,coderclaw.outcome,coderclaw.chatId,coderclaw.messageId,coderclaw.sessionKey,coderclaw.sessionId,coderclaw.reason
coderclaw.session.stuckcoderclaw.state,coderclaw.ageMs,coderclaw.queueDepth,coderclaw.sessionKey,coderclaw.sessionId
Sampling + flushing
Section titled “Sampling + flushing”- Trace sampling:
diagnostics.otel.sampleRate(0.0–1.0, root spans only). - Metric export interval:
diagnostics.otel.flushIntervalMs(min 1000ms).
Protocol notes
Section titled “Protocol notes”- OTLP/HTTP endpoints can be set via
diagnostics.otel.endpointorOTEL_EXPORTER_OTLP_ENDPOINT. - If the endpoint already contains
/v1/tracesor/v1/metrics, it is used as-is. - If the endpoint already contains
/v1/logs, it is used as-is for logs. diagnostics.otel.logsenables OTLP log export for the main logger output.
Log export behavior
Section titled “Log export behavior”- OTLP logs use the same structured records written to
logging.file. - Respect
logging.level(file log level). Console redaction does not apply to OTLP logs. - High-volume installs should prefer OTLP collector sampling/filtering.
Troubleshooting tips
Section titled “Troubleshooting tips”- Gateway not reachable? Run
coderclaw doctorfirst. - Logs empty? Check that the Gateway is running and writing to the file path
in
logging.file. - Need more detail? Set
logging.leveltodebugortraceand retry.