How to Capture and Share Network Logs for Debugging

Written By  Crosscheck Team

Content Team

July 14, 2025 11 minutes

How to Capture and Share Network Logs for Debugging

How to Capture and Share Network Logs for Debugging

When something breaks in a web application, the console is usually the first place developers look. But the network tab tells a different story — one that's often more useful. Failed API calls, slow responses, missing headers, and CORS rejections all leave traces in network logs that the console alone won't surface.

Knowing how to capture those logs, read them fluently, and share them with the right context is one of the highest-leverage debugging skills you can develop. This guide covers everything from the basics of the Chrome DevTools Network tab to exporting HAR files, filtering for the requests that matter, and working through the most common real-world debugging scenarios.


What Network Logs Actually Capture

Every time a browser loads a page or a user interacts with a web app, the browser fires off a series of HTTP requests — for HTML, CSS, JavaScript, fonts, images, API data, and more. The Network tab in Chrome DevTools intercepts and records all of these, giving you a complete picture of every conversation between the browser and any server it talks to.

For each request, the Network tab captures:

  • URL and HTTP method — what was requested and how (GET, POST, PUT, DELETE, etc.)
  • Status code — whether the request succeeded, failed, or was redirected
  • Request headers — what the browser sent along with the request (cookies, authorization tokens, content type, etc.)
  • Response headers — what the server sent back (CORS policies, caching directives, content type, etc.)
  • Request payload — the body of POST and PUT requests (form data, JSON, multipart uploads)
  • Response body — the actual data the server returned
  • Timing breakdown — how long each phase of the request took, from DNS lookup to content download
  • Initiator — which line of code or resource triggered the request

That combination gives you everything you need to diagnose most frontend and API bugs without ever needing to access server-side logs.


Opening and Using the Network Tab

To open the Network tab in Chrome:

  1. Right-click anywhere on the page and select Inspect, or press F12 / Cmd+Option+I on Mac
  2. Click the Network tab in the DevTools panel
  3. Important: The Network tab only records requests made while it's open. Reload the page (Cmd+R / Ctrl+R) after opening it to capture the full page load sequence

Once open, you'll see a waterfall of requests populating in real time. Each row is one HTTP request. The columns you'll use most are Name, Status, Type, Initiator, Size, and Time.

Preserving Logs Across Navigation

By default, the Network log clears every time the page navigates. If you're debugging a multi-step flow — a login redirect, a form submission that navigates away, or a checkout sequence — check the Preserve log checkbox at the top of the Network panel. This keeps all requests in the log even as the page changes.

Disabling Cache

Browser caching can mask network issues. While DevTools is open, check Disable cache to force the browser to re-request every resource on every load. This is essential when debugging stale assets, CDN issues, or cache-related bugs.


Reading Status Codes

HTTP status codes are the first signal of whether something went right or wrong. They fall into five ranges:

  • 1xx (Informational): Rarely seen in normal debugging. 101 Switching Protocols appears with WebSocket connections.
  • 2xx (Success): The request worked. 200 OK is the most common. 201 Created indicates a resource was successfully created. 204 No Content means success with no response body.
  • 3xx (Redirection): The client needs to go somewhere else. 301 Moved Permanently and 302 Found are common redirects. 304 Not Modified means the browser used its cached version.
  • 4xx (Client Errors): Something was wrong with the request. 400 Bad Request means malformed input. 401 Unauthorized means authentication is missing or invalid. 403 Forbidden means authenticated but not permitted. 404 Not Found means the resource doesn't exist. 422 Unprocessable Entity means the input was syntactically valid but semantically wrong.
  • 5xx (Server Errors): The server failed. 500 Internal Server Error is a generic catch-all. 502 Bad Gateway and 503 Service Unavailable indicate infrastructure problems. 504 Gateway Timeout means a downstream service didn't respond in time.

In the Network tab, Chrome color-codes rows: green for 2xx, orange/yellow for 3xx, red for 4xx and 5xx. A quick visual scan of the waterfall will immediately surface failed requests.


Understanding Request and Response Details

Click any request row to open its detail panel. You'll see several tabs:

Headers

The Headers tab shows the full request and response headers. Key things to look for:

  • Request Headers: Check Authorization for bearer tokens or API keys, Content-Type to verify the format being sent (application/json vs. multipart/form-data), and Cookie for session data.
  • Response Headers: Check Access-Control-Allow-Origin for CORS configuration, Cache-Control and ETag for caching behavior, Content-Type to verify the server is returning what you expect, and Set-Cookie for session management issues.

Payload

For POST, PUT, and PATCH requests, the Payload tab shows exactly what the browser sent. This is invaluable for debugging form submissions and API calls — you can verify whether the request body matches what the backend expects, catch missing fields, confirm JSON encoding, and spot encoding issues with special characters.

Response

The Response tab shows the raw response body. For API requests, this is where you'll see the JSON (or XML, or HTML) the server returned. When debugging error responses, the body often contains more detail than the status code alone — error messages, validation failures, and stack traces (in development environments) all appear here.

Timing

The Timing tab breaks the request lifecycle into phases:

  • Queueing: Time the request spent waiting before the browser sent it (can indicate connection limits or high priority resources blocking lower-priority ones)
  • Stalled: Time waiting for a connection to be available
  • DNS Lookup: Time to resolve the domain name
  • Initial Connection / SSL: Time to establish the TCP connection and complete the TLS handshake
  • Request Sent: Time to transmit the request
  • Waiting (TTFB): Time to First Byte — how long the server took to start responding. This is the most important metric for server-side performance.
  • Content Download: Time to transfer the response body

A high TTFB points to server-side slowness (database queries, API calls, slow computations). A high Content Download time points to large response payloads or slow network conditions.


Filtering and Finding What Matters

A busy page can generate hundreds of requests. The filter bar at the top of the Network panel is essential for cutting through the noise.

Filter by Type

The type buttons (All, Fetch/XHR, JS, CSS, Img, Media, Font, Doc, WS, Wasm, Other) let you narrow the view to specific resource categories. For API debugging, click Fetch/XHR to see only AJAX and Fetch requests — this immediately hides all the static asset noise.

Filter by Text

The search box filters requests by URL. Type a path fragment, endpoint name, or domain to find specific requests immediately. Prefix your search with - to exclude matches (e.g., -static to hide all requests to your static asset CDN).

Filter by Status

Type status-code:4 in the filter box to show only 4xx errors, or status-code:5 for 5xx errors. You can also right-click any request and use Filter requests with the same status code to isolate all matching responses.

Sort by Time or Size

Click the Time column header to sort by slowest requests, or click Size to find the largest payloads. Both are useful starting points for performance investigations.

The Search Panel

For searching inside request and response bodies — not just URLs — open the Search panel with Cmd+F / Ctrl+F while the Network tab is active. This lets you find a specific parameter value, error message, or token across all captured network traffic.


Identifying Slow Requests

The waterfall visualization on the right side of the Network panel is the fastest way to spot performance problems. Each bar represents one request, and its position and length show when it started and how long it took.

Things to look for in the waterfall:

  • Long bars in sequence: If requests are stacking vertically (each starting only after the previous finishes), you may have a request chain or dependency problem that could be parallelized.
  • A long TTFB block (blue): Server processing is slow. The fix is on the backend — optimize queries, add caching, reduce payload computation.
  • A long content download block (gray): The response is large. Consider pagination, compression (check the response headers for Content-Encoding: gzip or br), or switching to a more efficient data format.
  • Blocking resources at the start: JavaScript files loaded in the <head> without async or defer block rendering. Look for large JS or CSS files appearing early in the waterfall with everything else queued behind them.

For quick quantification, the bottom status bar shows the total number of requests, total transfer size, and total load time for the current filter view.


Exporting HAR Files

A HAR (HTTP Archive) file captures the complete network session — every request, every response, every header, every timing measurement — in a structured JSON format that can be shared, replayed, or analyzed with external tools.

How to Export a HAR File

  1. Reproduce the issue with the Network tab open and Preserve log enabled
  2. Right-click anywhere in the request list and select Save all as HAR with content, or click the download icon in the Network panel toolbar
  3. Save the .har file

What to Do With a HAR File

  • Share with backend developers: They can see exactly what requests the frontend made, with full headers and payloads, without needing to reproduce the issue themselves
  • Share with third-party API support: When a third-party API is behaving unexpectedly, a HAR file gives their support team everything they need to investigate
  • Analyze with external tools: Google's HAR Analyzer, the HAR Viewer at toolbox.googleapps.com, and Charles Proxy can all import HAR files for further analysis
  • File with bug reports: A HAR file attached to a bug report eliminates almost all back-and-forth about what requests were made and what the server returned

Security note: HAR files contain full request headers, which means they can contain authentication tokens, session cookies, and API keys. Sanitize sensitive values before sharing HAR files externally or including them in public bug trackers.


Common Debugging Scenarios

Scenario 1: API Call Returning 401 Unauthorized

A user reports they're getting logged out unexpectedly, or a feature stops working after some time. In the Network tab, filter by Fetch/XHR and look for requests returning 401.

Click the failing request and check:

  • Request Headers > Authorization: Is the token present? Is it formatted correctly (e.g., Bearer <token>)?
  • Response body: Does the server return a specific error message — token expired, token invalid, missing token?
  • Timing: Did the 401 happen immediately or after a delay that might suggest a token refresh race condition?

Common causes: expired JWT not being refreshed, token stored in localStorage being cleared, a cookie set to a different domain or path than expected.

Scenario 2: CORS Errors Blocking Requests

CORS (Cross-Origin Resource Sharing) errors appear in the console as messages like Access to fetch at 'https://api.example.com' from origin 'https://app.example.com' has been blocked by CORS policy. But the detail you need for debugging is in the Network tab.

Find the failing request (it may show as (failed) or return a 0 status). Check:

  • Response Headers: Is Access-Control-Allow-Origin present? Does it match the requesting origin?
  • Request Headers: Look for the Origin header — this is what the server needs to allow
  • Preflight request: For non-simple requests (POST with JSON, custom headers), the browser sends an OPTIONS request first. Find it in the Network tab. If the OPTIONS request is failing or returning incorrect headers, the actual request will never be made.

CORS is always a server-side configuration issue. The fix lives in the server's response headers, not the frontend code.

Scenario 3: Slow Page Load

A user reports a page feels slow. Open the Network tab, disable cache, and reload. Sort by Time descending and look at:

  • The total load time in the status bar
  • Which request has the longest TTFB
  • Whether large JavaScript bundles are blocking render
  • Whether third-party scripts (analytics, chat widgets, ad networks) are adding significant time

The waterfall will often tell the story at a glance: a single slow API call holding everything up, a large uncompressed bundle, or a cascade of redirects adding hundreds of milliseconds before the first useful content loads.

Scenario 4: Form Submission Silently Failing

A user fills out a form, clicks submit, and nothing happens — no error message, no confirmation. Filter by Fetch/XHR and look for the request that fires on submission.

Check:

  • Status code: Is it a 4xx or 5xx? Even if the UI doesn't show an error, the network response will tell you
  • Response body: Does it contain validation errors or an error message?
  • Payload: Is the form data being sent correctly? Are any required fields missing or malformed?

This scenario is particularly common with custom form handling where error states aren't properly wired to the UI.

Scenario 5: Unexpected 304 Not Modified

A user reports seeing stale data — a change they made isn't showing up, or a page is showing outdated content. Find the request for the relevant data and check if it returned 304. This means the server told the browser to use its cached copy.

Check:

  • Request Headers: If-None-Match and If-Modified-Since — these are the cache validators the browser sent
  • Response Headers: Cache-Control, ETag, Expires — what caching policy is the server setting?

The fix might be adding cache-busting query parameters, setting appropriate Cache-Control headers on the server, or calling cache: 'no-store' in your Fetch options.


Sharing Network Logs Effectively

Captured network logs are only useful if they're shared in a way that lets the recipient act on them. A few principles:

Include context with raw data. A HAR file alone doesn't tell the developer which request is the problem. Call it out explicitly: "The failing request is the POST to /api/orders at timestamp 14:32:07. It returns 422 with the body attached."

Capture the exact reproduction. Network logs from a different browser session, user account, or data state may not reproduce the issue. Note the environment, user role, and exact steps taken before capturing.

Highlight the relevant request. When including a screenshot of the Network tab, annotate which row is the problem. Developers shouldn't have to hunt through 200 requests to find the relevant one.

Include both the failing request and any preceding requests. A 401 on a data request may be caused by a failed token refresh request a few seconds earlier. Context before the failure is often as important as the failure itself.


Stop Doing This Manually With Every Bug

Working through the Network tab, identifying the relevant requests, capturing screenshots, exporting HAR data, and then assembling all of it into a coherent bug report is thorough — but it's also time-consuming, easy to forget steps in, and dependent on the reporter knowing what to look for.

Crosscheck automates all of it. When you capture a bug with Crosscheck, it automatically records every network request made in the session — including the URL, HTTP method, status code, response time, and headers — and bundles it alongside the screenshot, screen recording, and console logs into a single shareable bug report.

There's no manual export, no HAR file to sanitize, no annotating screenshots. The developer receiving the report sees the exact network activity that preceded and accompanied the bug, with the same level of detail you'd get from a hands-on DevTools session — without the reporter needing to know how to use DevTools at all.

For teams that file a lot of bugs, or for QA engineers who need to document issues quickly and completely, that automatic network capture is the difference between a bug report that resolves in one round of back-and-forth and one that takes a week of clarifying questions.

If you're serious about capturing and sharing network logs for debugging, building that habit starts in DevTools — and scales with the right tooling behind it.

Related Articles

Contact us
to find out how this model can streamline your business!
Crosscheck Logo
Crosscheck Logo
Crosscheck Logo

Speed up bug reporting by 50% and
make it twice as effortless.

Overall rating: 5/5