| name | netlify-debugging |
| description | Debug Netlify deployments, functions, and builds. Use when troubleshooting build failures, function errors, deployment issues, or monitoring logs on Netlify. |
| license | Apache-2.0 |
| metadata | {"author":"netlify","version":"1.0"} |
Netlify Debugging
Guide to debugging builds, functions, deployments, and runtime issues on Netlify.
When to Use
- Build failures or timeouts
- Function errors or timeouts
- Deployment not working as expected
- Environment variable issues
- Redirect/rewrite problems
- Performance troubleshooting
Function Logs
Viewing in Netlify UI
- Go to your site dashboard
- Navigate to Logs → Functions
- Select a function to view its logs
- Filter by time range or search for specific errors
Streaming Logs with CLI
netlify functions:log
netlify functions:log --name=my-function
netlify functions:log --tail
netlify functions:log --level=error
Adding Logs to Functions
export default async (request: Request, context: Context) => {
console.log("Request received:", {
method: request.method,
url: request.url,
headers: Object.fromEntries(request.headers),
});
try {
const result = await processRequest(request);
console.log("Request processed successfully:", result);
return Response.json(result);
} catch (error) {
console.error("Error processing request:", error);
return new Response("Internal error", { status: 500 });
}
};
Structured Logging
function log(level: "info" | "warn" | "error", message: string, data?: object) {
const entry = {
timestamp: new Date().toISOString(),
level,
message,
...data,
};
if (level === "error") {
console.error(JSON.stringify(entry));
} else {
console.log(JSON.stringify(entry));
}
}
log("info", "User logged in", { userId: "123" });
log("error", "Database connection failed", { error: err.message });
Build Logs
Viewing Build Logs
- Go to Deploys in site dashboard
- Click on a deploy
- View Deploy log for full build output
Local Build Testing
npm run build
netlify build
netlify build --context=deploy-preview
Common Build Issues
Out of Memory
[build.environment]
NODE_OPTIONS = "--max_old_space_size=4096"
Missing Dependencies
npm install missing-package --save
Build Timeout
[build]
command = "npm run build"
publish = "dist"
Environment Variables
Debugging Environment Variables
console.log("NODE_ENV:", process.env.NODE_ENV);
console.log("CONTEXT:", process.env.CONTEXT);
console.log("DEPLOY_URL:", process.env.DEPLOY_URL);
if (!process.env.API_KEY) {
console.error("API_KEY is not set!");
}
Netlify-Provided Variables
| Variable | Description |
|---|
CONTEXT | Build context: production, deploy-preview, branch-deploy |
DEPLOY_URL | URL of the current deploy |
DEPLOY_PRIME_URL | Primary URL for the deploy |
URL | Main site URL |
SITE_ID | Netlify site ID |
SITE_NAME | Site name |
BUILD_ID | Unique build ID |
COMMIT_REF | Git commit SHA |
BRANCH | Git branch name |
Testing Different Environments
netlify dev --context production
netlify env:list
Debugging Redirects
Testing Redirects Locally
netlify dev
Common Redirect Issues
[[redirects]]
from = "/api/*"
to = "/.netlify/functions/api/:splat"
status = 200
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
Debugging with Headers
[[headers]]
for = "/*"
[headers.values]
X-Debug = "true"
Function Debugging
Local Function Development
netlify dev
Debugging Timeouts
export default async (request: Request, context: Context) => {
const start = Date.now();
try {
const result = await someOperation();
console.log(`Operation took ${Date.now() - start}ms`);
return Response.json(result);
} catch (error) {
console.error(`Failed after ${Date.now() - start}ms:`, error);
throw error;
}
};
Memory Issues
export default async (request: Request) => {
const memBefore = process.memoryUsage();
console.log("Memory before:", {
heapUsed: Math.round(memBefore.heapUsed / 1024 / 1024) + "MB",
heapTotal: Math.round(memBefore.heapTotal / 1024 / 1024) + "MB",
});
const memAfter = process.memoryUsage();
console.log("Memory after:", {
heapUsed: Math.round(memAfter.heapUsed / 1024 / 1024) + "MB",
});
return new Response("OK");
};
Edge Function Debugging
Edge Function Logs
netlify logs:function --edge
Local Edge Function Testing
netlify dev
Deploy Previews
Debugging Deploy Previews
- Each PR gets a unique deploy preview URL
- Check the deploy log for the specific PR
- Test the preview URL to reproduce issues
netlify deploy --build
CLI Debugging Commands
netlify status
netlify sites:list
netlify link --status
netlify env:list
netlify functions:invoke function-name --payload '{"key": "value"}'
netlify open
netlify open:logs
Troubleshooting Checklist
Build Failures
Function Issues
Deployment Issues
Environment Variable Issues
Log Drains (Advanced)
Send logs to external services:
netlify logs:drain add --type http --destination https://logs.example.com/ingest
netlify logs:drain list
Performance Debugging
Function Cold Starts
let isWarm = false;
export default async (request: Request) => {
if (!isWarm) {
console.log("Cold start detected");
isWarm = true;
}
};
Response Time Monitoring
export default async (request: Request, context: Context) => {
const startTime = performance.now();
const response = await handleRequest(request);
const duration = performance.now() - startTime;
console.log(`Request processed in ${duration.toFixed(2)}ms`);
return new Response(response.body, {
...response,
headers: {
...response.headers,
"X-Response-Time": `${duration.toFixed(2)}ms`,
},
});
};