Cloudflare (Worker)
Overview
1
2
Step 2
Configure your worker
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "log-collector",
"main": "src/index.ts",
"compatibility_date": "2025-12-09",
"observability": {
"enabled": true
},
"route": {
"pattern": "example.com/*",
"zone_name": "example.com"
},
"vars": { "LIMY_URL": "https://stream.getlimy.ai" }
}/**
* Cloudflare Worker for Log Collection
*
* This worker captures HTTP request/response data and forwards it to Limy's log collection API.
* It runs as a middleware, meaning it doesn't interfere with the actual request handling.
*/
export interface Env {
LIMY_KEY: string;
LIMY_URL: string;
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
// Get the original response
const response = await fetch(request);
// Clone the response so we can read it multiple times
const responseClone = response.clone();
ctx.waitUntil(handleRequest(request, responseClone, env));
return response;
}
} satisfies ExportedHandler<Env>;
async function handleRequest(request: Request, response: Response, env: Env) {
const requestUrl = new URL(request.url);
const cf = request.cf;
const headerSize = Array.from(response.headers.entries())
.reduce((total, [key, value]) => total + key.length + value.length + 4, 0);
const responseBody = await response.blob();
const bodySize = responseBody.size;
// Total bytes sent includes headers and body
const totalBytesSent = headerSize + bodySize;
const logData = {
// Timing
timestamp: Date.now(),
// Request basics
host: requestUrl.hostname,
method: request.method,
pathname: requestUrl.pathname,
query_params: Object.fromEntries(requestUrl.searchParams),
// Client info
ip: request.headers.get('cf-connecting-ip'),
userAgent: request.headers.get('user-agent'),
referer: request.headers.get('referer'),
acceptLanguage: request.headers.get('accept-language'),
// Response info
bytes: headerSize + bodySize,
status: response.status,
contentType: response.headers.get('content-type'),
// Cloudflare request ID
rayId: request.headers.get('cf-ray'),
// Geographic (from cf object)
country: cf?.country,
city: cf?.city,
region: cf?.region,
regionCode: cf?.regionCode,
continent: cf?.continent,
postalCode: cf?.postalCode,
latitude: cf?.latitude,
longitude: cf?.longitude,
timezone: cf?.timezone,
// Network
asn: cf?.asn,
asOrganization: cf?.asOrganization,
colo: cf?.colo, // Cloudflare datacenter
// Connection
httpProtocol: cf?.httpProtocol,
tlsVersion: cf?.tlsVersion,
tlsCipher: cf?.tlsCipher,
}
await fetch(env.LIMY_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': env.LIMY_KEY,
'User-Agent': 'Cloudflare-Worker-Logs'
},
body: JSON.stringify([logData])
}).catch(error => console.error('Failed to send logs:', error))
}3
Need More Help?
Last updated





