How to Capture Console Logs for Bug Reports in Chrome, Firefox, Safari, and Edge
To capture console logs for a bug report, open the browser's DevTools (F12 in Chrome, Firefox, and Edge; the Develop menu in Safari), switch to the Console panel, enable Preserve log on navigation, reproduce the bug, then right-click anywhere inside the console output and choose Save as… to export a .log file. That file — paired with steps to reproduce, the network response codes, and the browser version — is what turns a vague ticket into something a developer can fix in one sitting. This guide walks through the capture flow in every major browser, the mobile equivalents on iOS and Android, the filters that keep the noise down, and how to scrub credentials out before you hit Send.
Key takeaways
- The single most useful toggle is Preserve log on navigation — without it, the console clears every time the page reloads or redirects, which is exactly when interesting bugs surface.
- Chrome, Edge, and Firefox all support right-click → Save as… to export the full console; Safari requires copy-paste because Apple removed the file-save action.
- Mobile Safari logs are inspected from a tethered Mac via Settings → Safari → Advanced → Web Inspector; Chrome on Android exposes its console through
chrome://inspecton a tethered desktop. - Console logs without timestamps, network status codes, and steps to reproduce are usually not enough — developers will come back asking for more.
- Authorization headers, cookies, and bearer tokens regularly leak into console output and request previews. Redact before sharing externally.
What console logs actually contain
A browser console is the running transcript of three streams: messages developers wrote on purpose with console.log(), console.warn(), and console.error(); messages the JavaScript runtime emits when something throws or rejects; and messages the network layer produces when a request fails or a security policy blocks something. They are interleaved chronologically, which is why they reconstruct a bug so well — they show what the page was doing in the seconds before, during, and after the failure.
Without that transcript, a developer is reading a bug report the way an air-crash investigator would read a passenger's witness statement — useful, but not definitive.
How to capture console logs in Chrome
Chrome ships DevTools with every install, and the Console panel is the canonical reference for how this workflow looks across Chromium browsers.
Open the Console
- Windows / Linux:
Ctrl + Shift + J - macOS:
Cmd + Option + J - Or right-click anywhere on the page → Inspect → click the Console tab.
Configure for a clean capture
Before you reproduce the bug, set the console up so it does not lose data the moment something interesting happens:
- Click the gear icon in the top-right of the DevTools panel to open Console settings.
- Tick Preserve log (sometimes labelled Preserve log on navigation). Without this, the console wipes itself on every reload and redirect — which is exactly when auth flows, payment redirects, and SPA route changes fail.
- Tick Show timestamps. Each line will be prefixed with
HH:MM:SS.mmm, which lets developers line console messages up against network requests and recordings. - Optionally disable Group similar so repeated errors are not collapsed under a
(12)counter — developers usually want the full sequence.
Switch to the Network tab and turn on its own Preserve log checkbox while you are there. Network failures are the other half of the story, and the two logs are meaningless apart.
Reproduce the bug
With everything armed, walk through the steps that produce the failure. The console will fill up. Do not close the tab.
Save the output
Right-click anywhere inside the console output area and choose Save as…. Chrome writes the entire console — including timestamps, stack traces, and source-file references — to a .log text file. Attach that file to the bug ticket.
If your team requires logs pasted into ticket descriptions instead, select all (Ctrl/Cmd + A while focused inside the console), copy, and paste. The text version preserves error messages and timestamps but drops some of the structured formatting.
Filtering the noise
Production sites can emit hundreds of warnings that have nothing to do with the bug at hand. The severity dropdown at the top of the Console lets you toggle Errors, Warnings, Info, Verbose, and Default levels — filter to Errors only first, then widen to Errors and Warnings to surface what matters. The text filter accepts substrings (fetch, cors, undefined), regular expressions (/^Uncaught/), and negation (-Deprecation).
The defensible default is to save the unfiltered log so developers can apply their own filters, and paste an error-only excerpt directly into the ticket description for readability.
How to capture console logs in Microsoft Edge
Edge is built on Chromium, so the DevTools experience is nearly identical to Chrome — same shortcuts, same panels, same Preserve log checkbox. There are two practical differences worth knowing.
- Edge's DevTools open with the shortcut
F12orCtrl + Shift + I(Windows) /Cmd + Option + I(macOS). The dedicated Console shortcut from Chrome (Ctrl + Shift + J) also works. - Edge defaults to Focus Mode, which hides some DevTools controls behind a sidebar. If the Save as… option is missing from your right-click menu, toggle Focus Mode off via the gear icon → Restore defaults and reload.
Everything else — filters, severity levels, timestamp toggle, file export — behaves the way Chrome does.
How to capture console logs in Firefox
Firefox's DevTools are functionally equivalent but use slightly different terminology.
Open the Console
- Windows / Linux:
Ctrl + Shift + K - macOS:
Cmd + Option + K
Configure for a clean capture
In Firefox, the equivalent of Preserve log on navigation is called Persist Logs. Click the gear icon in the Console toolbar and tick Enable persistent logs. Timestamps live under the same settings panel — tick Show Timestamps.
Reproduce and export
Reproduce the bug, then right-click anywhere in the console output and choose Export Visible Messages To → File to write a .log file, or Clipboard to copy. Firefox also offers Export All Messages To if you have filters applied but want the full transcript saved out anyway.
Firefox's filter bar accepts the same severity toggles (Errors, Warnings, Logs, Info, Debug) and supports text and regex search.
How to capture console logs in Safari
Safari's Web Inspector is hidden by default. Apple ships it disabled because it is intended for developers, not end users.
Enable the Develop menu
- Open Safari → Safari menu → Settings → Advanced.
- Tick Show features for web developers (older versions: Show Develop menu in menu bar).
- A Develop menu appears in the menu bar.
Open the Web Inspector
Right-click on the page → Inspect Element, or use Cmd + Option + I. Switch to the Console tab.
Configure
Safari's equivalent of Preserve log on navigation is the Preserve Log toggle in the Console toolbar — a small clock-with-arrow icon at the top of the panel. Click it once and it stays on for the session.
Capture
Apple removed the Save as… menu item from Safari's console output years ago, which is the one place Safari diverges meaningfully from Chrome and Firefox. You have two options:
- Select all (
Cmd + Awhile focused in the console) → copy → paste into a.txtfile or directly into the bug ticket. - Take a screenshot of the console panel (
Cmd + Shift + 4then space, then click the DevTools window). Screenshots are a fallback for ad-hoc capture but lose copy-pasteability.
Safari's filter bar supports the same Errors / Warnings / Logs / Info filtering as the other browsers, and the search box accepts plain text.
How to capture console logs on mobile — Safari iOS and Chrome Android
Mobile bugs that never reproduce on desktop are common, and they are exactly the cases where logs matter most. The capture flow requires a tethered desktop on both major mobile platforms.
Safari on iPhone and iPad (remote Web Inspector)
- On the iOS device: Settings → Safari → Advanced → Web Inspector → toggle on. On newer iOS versions you may also need Settings → Privacy & Security → Developer Mode.
- Connect the device to a Mac via USB (first session must be wired; later sessions can be Wi-Fi over the same network if you check Connect via network in the Devices window on Mac).
- On the Mac, open Safari → Develop menu → select the device name → click the page you want to inspect.
- A standalone Web Inspector window opens. Switch to the Console tab. Logs from the iPhone stream into the Mac window in real time, including
console.logcalls, JavaScript exceptions, and network failures. - Enable Preserve Log in the Web Inspector before reproducing the bug. Capture by selecting all and copying — the same constraint as desktop Safari.
Apple's official guidance on inspecting iOS covers the edge cases — service workers, Home Screen web apps, and content inside apps using WKWebView.
One known limitation worth flagging: the iOS Simulator's Web Inspector currently has trouble attaching to insecure-context pages served from http://localhost. If the Console pane appears empty when inspecting a localhost target, switch the dev server to HTTPS or use a real device.
Chrome on Android (remote debugging via chrome://inspect)
- On the Android device: enable Developer options (Settings → About phone → tap Build number seven times) → toggle USB debugging on.
- Connect the device to a desktop via USB. Approve the debugging prompt on the device.
- In desktop Chrome, navigate to
chrome://inspect/#devices. Make sure Discover USB devices is checked. The device and its open tabs appear in the list. - Click Inspect next to the tab you want. A full Chrome DevTools window opens, mirroring the mobile page.
- Use the Console tab exactly as you would on desktop — Preserve log, timestamps, severity filtering, Save as…. The captured log is from the mobile device, not the desktop.
Firefox and Edge on Android follow the same remote-inspect pattern via their respective desktop browsers, though usage is small enough that most teams standardise on Chrome.
Common console errors and what they mean
When pasting an error into a ticket, include the full message and the file/line reference — the trailing app.bundle.js:1247:15 is often what points the developer at the right module. The errors below come up most often in QA work:
Uncaught TypeError: Cannot read properties of undefined— code tried to read a field from something that wasn't there. Usually an API returning a different shape than the front end expected.Uncaught ReferenceError: <name> is not defined— a variable or function was never declared in scope. Frequently means a script failed to load or executed out of order.404 (Not Found)— the page tried to fetch a resource that does not exist at that URL. A typo in a deploy, a missing asset, or a stale CDN.500 (Internal Server Error)— the request reached the server, the server crashed processing it. Almost always a backend issue.CORS error/Access-Control-Allow-Origin— the browser blocked a cross-origin request the server didn't authorise. Often a misconfigured environment after a deploy.net::ERR_FAILED/net::ERR_CONNECTION_REFUSED— the request never reached a server. Common in staging when a dependent service is down.Mixed Content— HTTPS page tried to load an HTTP resource. Modern browsers block this silently, which can make features appear broken with no visible error.
Redacting sensitive data before you share a log
Console output and network captures regularly contain credentials. A real .log file from a logged-in session typically includes bearer tokens in Authorization headers, session cookies, customer email addresses, PII in response payloads, and internal endpoint URLs. Sharing that with a contractor or pasting it into a public Slack channel without scrubbing is a routine source of incidents.
A practical checklist before attaching a log:
- Search the file for
Authorization,Bearer,Cookie,Set-Cookie,session,token,apikey,password. Replace matches with[REDACTED]. - Search for
@to find email addresses; redact any that aren't test accounts. - Look at network response bodies — production JSON often contains user IDs, addresses, or financial fields that should be masked even when sharing internally.
This is tedious by hand, which is the practical case for an automated capture layer rather than the manual export workflow.
Why the manual workflow breaks down in practice
Knowing the manual capture flow is genuinely useful. It is also genuinely painful as a daily QA habit. Three failure modes recur:
- DevTools wasn't open before the bug fired. Console output before DevTools opened is lost in most browsers — by the time you remember to open it, the relevant errors are gone, and you are back to reproducing the bug from scratch just to capture the log.
- Multi-tab and redirect flows lose context. Auth flows, payment redirects, and OAuth handshakes hop across tabs or domains. Each new tab has its own DevTools session; logs do not follow you.
- The log alone is not enough. A developer reading a console export still asks for steps to reproduce, the network tab's HAR file, browser version, screen size, and any feature flags. Capturing each of those by hand is the actual time sink.
The underlying problem isn't ignorance of DevTools — it is that the bug-reporting pinch point hasn't kept up with how fast tests have gotten. Test suites run 5× faster than they did five years ago; the time to file a clean, reproducible bug has barely moved.
The automated alternative
Crosscheck is a free Chrome extension that captures the entire technical context of a bug — screenshot or screen recording, console logs with timestamps, full network requests including status codes and response bodies, the user action timeline, and environment metadata — and sends it as a single report into Jira, Linear, ClickUp, GitHub, or Slack.
The capture is passive: the extension runs in the background, so DevTools never needs to be open. When a tester clicks the Crosscheck icon to file a bug, the previous session's console output is already attached. Preserve log on navigation is effectively always on, because Crosscheck is recording continuously rather than reading from the live console panel.
A few specifics that matter for the workflows above:
- Sensitive headers are redacted by default.
Authorization,Cookie, andSet-Cookieare stripped from network captures automatically, so reports can be shared with external contractors without leaking session credentials. - Console messages are time-aligned with the screen recording. Reviewing a report in the Crosscheck viewer lets a developer scrub the video and watch the corresponding console errors fire in real time.
- Cross-browser support. While the extension runs in Chromium browsers (Chrome, Edge, Brave, Arc), the captured reports surface bugs reproduced in those browsers without per-browser configuration.
For teams who have settled on a structured bug-report format, the perfect bug report template covers the surrounding context — repro steps, expected vs actual, environment — and a list of the best bug reporting tools in 2026 sets out where Crosscheck sits against the alternatives. For deeper diagnostic work, the Chrome DevTools performance auditing guide covers the panels that sit alongside the Console.
FAQ
How do I save the entire console log in Chrome?
Open DevTools, switch to the Console tab, tick Preserve log in Console settings, reproduce the bug, then right-click anywhere inside the console output and choose Save as…. Chrome writes a .log text file containing every message — including timestamps and source references — that you can attach to a bug ticket. Apple's official Chrome DevTools Console reference covers the same flow with screenshots.
Why does my console clear when the page reloads?
Browsers clear the console on navigation by default. Enable Preserve log on navigation in Chrome and Edge, Persist Logs in Firefox, or the Preserve Log toggle in Safari's Web Inspector before reproducing the bug. The setting only persists within the current DevTools session — close DevTools and you may need to re-enable it.
Can I capture console logs from an iPhone?
Yes — on iOS, enable Settings → Safari → Advanced → Web Inspector, tether the iPhone to a Mac via USB, and open the Mac's Safari Develop menu. Pick the device, then the tab, and a remote Web Inspector window appears with full console access. Chrome and other non-Safari browsers on iOS cannot be remotely inspected — Apple does not expose their WebKit instance.
How do I capture console logs on Android?
On the Android device, enable USB debugging under Developer options. On a desktop running Chrome, go to chrome://inspect/#devices, tick Discover USB devices, and click Inspect next to the tab. Full Chrome DevTools opens, mirroring the mobile page, and the Console works exactly as it does on desktop.
What should I redact from a console log before sharing?
Authorization headers, Cookie and Set-Cookie values, bearer tokens, API keys, session IDs, passwords, customer email addresses, and any PII inside response payloads. Open the .log in a text editor and search for each of those strings, replacing matches with [REDACTED] before attaching the file to a ticket — particularly if the ticket may be visible to external contractors.
Why is console output alone usually not enough for a bug report?
Developers typically also need the network requests (URLs, status codes, response bodies), the sequence of user actions before the failure, and environment metadata like browser version and screen resolution. Console errors point at a symptom; reproducing the bug requires the full surrounding context. Tooling that captures all of it together turns a back-and-forth ticket into a one-shot one.
Start capturing console logs the easier way
The manual workflow is worth knowing — for one-off bugs, for working on someone else's machine, for the moments when no tooling is installed. But for the day-to-day reality of QA work in 2026, capturing the console manually is the wrong default. The tester is the wrong person to be running DevTools; the bug-report tool is.
Crosscheck attaches console logs, network requests, and the full session timeline to every bug report automatically, with sensitive headers redacted by default. No DevTools, no copy-paste, no missed sessions.



