Netlify (Free Plan)
Netlify Access Log Forwarding with edge functions
Architecture
Request → Edge Function → Netlify Blobs (buffer)
↓
Scheduled Function (every 1 min) → batch POST (x-api-key) → your endpoint
↓
Cleanup: deletes sent entries from Blobs
Client SPA navigation → useAccessLog hook → /api/access-log proxy fn (adds x-api-key) → your endpointSetup
1. Create the Edge Function
import { getStore } from "@netlify/blobs";
import type { Config, Context } from "@netlify/edge-functions";
export default async (request: Request, context: Context) => {
const startTime = Date.now();
const response = await context.next();
const duration = Date.now() - startTime;
const url = new URL(request.url);
const logEntry = {
timestamp: new Date().toISOString(),
method: request.method,
url: request.url,
path: url.pathname,
query: url.search,
status_code: response.status,
duration_ms: duration,
client_ip: context.ip,
user_agent: request.headers.get("user-agent"),
referer: request.headers.get("referer"),
content_type: response.headers.get("content-type"),
country: context.geo.country?.code,
city: context.geo.city,
region: context.server.region,
request_id: context.requestId,
site: context.site.name,
deploy_id: context.deploy.id,
};
const key = `${Date.now()}-${crypto.randomUUID()}`;
context.waitUntil(
getStore("access-logs")
.setJSON(key, logEntry)
.catch((err) => console.error("Failed to buffer access log:", err))
);
return response;
};
export const config: Config = {
path: "/*",
};2. Create the Scheduled Flush Function
3. Create the Client Log Proxy Function
4. Update netlify.toml
netlify.toml5. Install Dependencies
6. Configure the API Key Secret
7. Deploy
Configuration
Setting
Where
Default
Payload Format
Free Tier Limits
Resource
Limit
Last updated