Skills cf-workers-logs
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/adahubble/cf-workers-logs" ~/.claude/skills/clawdbot-skills-cf-workers-logs && rm -rf "$T"
manifest:
skills/adahubble/cf-workers-logs/SKILL.mdsource content
Query Cloudflare Workers Observability Logs
Query the CF Workers Observability API to retrieve structured logs from any Workers, Durable Objects, Workflows, Queues, and Cron Triggers in your Cloudflare account.
Prerequisites
Set these environment variables (e.g. in your project's
.env or shell profile):
— your Cloudflare account IDCF_OBSERVABILITY_ACCOUNT_ID
— API token with Workers Observability read permissionCF_OBSERVABILITY_API_TOKEN
API Endpoint
POST https://api.cloudflare.com/client/v4/accounts/{accountId}/workers/observability/telemetry/query Authorization: Bearer {apiToken} Content-Type: application/json
Request Body Format
{ "queryId": "cc-{timestamp}", "timeframe": { "from": "<unix_ms_start>", "to": "<unix_ms_end>" }, "view": "events", "limit": 50, "parameters": { "filters": [ {"key": "<field>", "operation": "<op>", "type": "<type>", "value": "<value>"} ], "filterCombination": "and", "calculations": [], "groupBys": [], "needle": {"value": "<search_text>", "isRegex": false, "matchCase": false}, "limit": 50 } }
Filter Operations
- String:
,eq
,neq
,includes
,doesNotInclude
,startsWith
,regex
,existsdoesNotExist - Number:
,eq
,neq
,gt
,gte
,lt
,lte
,existsdoesNotExist
Standard Fields
| Field | Type | Description |
|---|---|---|
| string | Worker script name |
| string | / |
| string | Entrypoint class (Worker, DO, Workflow) |
| string | , , , , |
| string | Log message |
| string | Log level (, , , ) |
| string | Error message |
| number | HTTP status code |
Any custom fields logged via
console.log({ key: value }) are also queryable as top-level fields.
Full-text Search
Use
needle.value for free-text search across all fields. Useful when you don't know which field contains the value.
How to Execute
Use Bash with
curl to call the API. Do NOT use WebFetch (it processes through an AI model and loses structure).
Step 1: Read credentials
Read
CF_OBSERVABILITY_ACCOUNT_ID and CF_OBSERVABILITY_API_TOKEN from environment variables. If not set in the shell, search for them in project .env files:
grep -r 'CF_OBSERVABILITY_' --include='.env' --include='.env.*' . 2>/dev/null
Step 2: Build and execute query
Construct the curl command based on the user's request. Default time range: last 1 hour. Default limit: 30.
Step 3: Format output
Parse the JSON response and format as a timeline:
{timestamp} [{level}] [{scriptName}/{entrypoint}] {msg} {extra fields if present: error=, status=, eventType=}
Events are in
result.events.events[]. Each event has:
: structured log fields (msg, level, plus any custom fields)source
: Worker metadata (scriptName, outcome, eventType, entrypoint)$workers
: system metadata (timestamp, requestId)$metadata
: event timestamp in unix mstimestamp
Sort events by timestamp ascending for chronological view.
Common Query Patterns
By Worker name
{"filters": [{"key": "$workers.scriptName", "operation": "eq", "type": "string", "value": "my-worker"}]}
Errors only
{"filters": [{"key": "level", "operation": "eq", "type": "string", "value": "error"}]}
By entrypoint (Durable Object / Workflow class)
{"filters": [{"key": "$workers.entrypoint", "operation": "eq", "type": "string", "value": "MyDurableObject"}]}
By event type (alarm, queue, scheduled, etc.)
{"filters": [{"key": "$workers.eventType", "operation": "eq", "type": "string", "value": "alarm"}]}
Exceptions (Worker crashed)
{"filters": [{"key": "$workers.outcome", "operation": "eq", "type": "string", "value": "exception"}]}
Custom field filter
{"filters": [{"key": "userId", "operation": "eq", "type": "string", "value": "user_123"}]}
Free-text search
{"needle": {"value": "search text here", "isRegex": false, "matchCase": false}}
Combine filters
{ "filters": [ {"key": "$workers.scriptName", "operation": "eq", "type": "string", "value": "my-worker"}, {"key": "level", "operation": "eq", "type": "string", "value": "error"} ], "filterCombination": "and" }
Argument Parsing
When invoked as
/cf-workers-logs, parse $ARGUMENTS for:
→ filter byworker=my-worker$workers.scriptName
→ filter by levellevel=error
→ filter byentrypoint=MyDO$workers.entrypoint
→ filter byevent=alarm$workers.eventType
→ needle searchsearch=xxx
→ filter by custom field<key>=<value>
/last=1h
/last=30m
→ time range (default: 1h)last=24h
→ result limit (default: 30)limit=N- No arguments → show recent errors across all Workers (last 1h, level=error)
Multiple arguments can be combined:
/cf-workers-logs worker=my-api level=error last=24h