Big Log Explorer

Filter, search, and graph 500 MB+ log files locally. No data is uploaded.

ZERO UPLOAD · ALL LOCAL

What to look for

  • mapped to error
  • mapped to warn
  • mapped to info

What this page covers

  • Placeholders applied URLs, IP addresses, UUIDs, long hex strings, and file paths, each their own token
  • Numbers integers and floating-point numbers collapse to one numeric placeholder
  • Templates shown top 50 by count, ranked most frequent first

The triage sequence

  • Step 1 click the ERROR pill to strip routine info lines
  • Step 2 read the time chart and drag across the spike to bound the window
  • Step 3 open the Patterns panel to rank which failure dominates

Export flags worth knowing

  • -p retrieves the previous container's logs after a crash
  • -l app=... --prefix gathers a whole deployment and tags each line with its pod
  • --timestamps prefixes each line with an RFC 3339 time

json-file driver, field by field

  • log the actual line your program emitted
  • stream marks stdout or stderr
  • time an RFC 3339 timestamp the daemon added

What to look for

  • 30 (numeric, reads as unclassified)
  • 50 (numeric, reads as unclassified)
  • time, ts, timestamp, or datetime
  • msg, message, or body

Field renames for python-json-logger

  • levelname → level gives the tool the level key it reads
  • asctime → timestamp gives the tool the clock key it reads
  • Default text format level sits mid-line after the logger name, so it is not read; lines default to info

Raw journalctl -o json field names

  • MESSAGE holds the text; the tool reads message, lowercase
  • PRIORITY a numeric syslog severity; the tool reads a level word
  • __REALTIME_TIMESTAMP epoch microseconds; the tool reads timestamp, lowercase

What the CloudWatch envelope gives you

  • timestamp lowercase, epoch milliseconds; charts directly, no reshaping needed
  • message lowercase; charts and searches directly
  • level not in the envelope; requires unwrapping the JSON inside message

What this page covers

  • Timestamp fields read timestamp, time, ts, @timestamp, or datetime (first match wins)
  • Severity fields read level, severity, or lvl
  • Message fields read message, msg, or body

What to look for

  • 7, fixed order
  • mapped to error
  • mapped to warn
  • mapped to info

What this page covers

  • Fields Combined adds over Common the quoted referer and the quoted user agent
  • Level source the HTTP status code only, never the referer or user agent

What this page covers

  • Zone designators read Z for UTC, or an explicit offset such as +02:00 or -0700
  • Level normalization fatal/critical to error, anything starting with warn to warn, trace/verbose to debug
  • Default level info, when no bracketed or bare severity follows the timestamp

What to look for

  • 8, numbered 0 (emergency) to 7 (debug)
  • facility × 8 + severity
  • not parsed, loads as raw text

What to look for

  • mapped to error
  • mapped to warn
  • mapped to info
  • not parsed, loads as raw text

What this page covers

  • Access log nicknames common (CLF) and combined (CLF plus referer and user agent)
  • Apache error log weekday-first timestamp, not parsed, loads as raw text
  • PHP error log day-month-year bracket, timestamp is parsed and charted

What this page covers

  • Folds into ERROR fatal, crit, critical, or anything beginning with err
  • Folds into WARN anything beginning with warn
  • Folds into DEBUG debug, trace, or verbose
  • Unmatched values fall into an other bucket, kept out of the four severity pills

Input (Log file)

PRIVACY GUARANTEED Your log file never leaves this tab. Parsing and indexing happen locally in your browser.

Drop a log or JSONL file here

or click to browse

JSONL ISO LOG CLF / NGINX
Indexing…
Search
Log level
Log volume over time

Output (Log lines)

TOP PATTERNS

  1. Drop a .log or .jsonl file onto the drop zone, or click to browse. Files up to 500 MB and beyond are supported.
  2. The tool indexes the file locally using a Web Worker and IndexedDB. A progress bar shows lines indexed and estimated time remaining.
  3. Use the search box and level pills (ALL / ERROR / WARN / INFO / DEBUG) to filter the log viewer.
  4. Drag on the time-series chart to narrow results to a specific time window. Click outside the selection to clear it.
  5. Use the Filter button in the Patterns panel to filter the log viewer to lines matching that template. Click Clear to remove the filter.

How it works

Most log viewers load the entire file into memory before showing anything. That caps their practical file size at whatever RAM the browser will hand over. Big Log Explorer takes a different path. A Web Worker reads the file in 1 MB chunks via the browser's File API.1 Workers run scripts in background threads without interfering with the user interface.2 The parsed records are written to IndexedDB one batch at a time.3 The browser tab keeps responding while indexing runs in the background.

Log explorer with a 600-line sample log loaded, a volume chart with error spikes in red, and the log lines color-coded by level
A 600-line sample log indexed in the browser: the volume chart marks ERROR lines in red across the minute, and each line keeps its level color (WARN dimmed, ERROR red) in the list below.

Once indexing completes, the Worker is terminated and the main thread opens a read-only connection to the same IndexedDB database. The log viewer uses virtual scrolling: only the rows currently on screen plus a small overscan buffer are in the DOM at any time. A spacer div sized to the total line count gives the scrollbar correct proportions across millions of lines.

Getting a stack's logs into the drop zone

Most real 500 MB log files come from a platform, not a laptop: a container orchestrator, a container runtime, a service manager's journal, or a cloud log service. Every one of these offers a way to write its output to a local file, and a local file is all the drop zone asks for. Once the file lands, the format follows the emitter. Structured JSON loggers drop one object per line into the JSON Lines branch, plain application text with a leading timestamp into the ISO 8601 branch, and ingress or web-server access logs into the Common Log Format branch. Nothing about the stack changes that routing.

Capture one service or one container at a time rather than a whole cluster's interleaved firehose. Pattern clustering reads best when a file comes from a single emitter, because interleaved producers weave their templates together and blur the counts. The platform's own log-retrieval path is the capture mechanism: Kubernetes documents a built-in way to fetch a pod's logs,4 and Docker documents the same for any container it runs,5 so getting logs onto disk needs nothing beyond the platform you already operate. Save the retrieved output as a file, drop it here, and the pipeline takes over from that point.

Opening Log Files Too Large for an Editor

Streaming the file in 1 MB chunks and indexing each line are what let the explorer open files that defeat a text editor. The guide below explains why editors and repeated grep runs struggle with multi-gigabyte logs, what you can do with a large file once it opens, and how to handle a log so big that even the browser's IndexedDB quota cannot hold it.

Big log files break the tools you reach for first. Open a two-gigabyte log in a text editor and it either refuses or freezes while it tries to load the whole thing into memory.1 Reach for grep and it works, but scanning a multi-gigabyte file line by line takes real time, and every new query pays the cost again.2 Tail and less handle streaming but give you no way to filter by level, chart a spike, or see which message repeats.

Big Log Explorer takes a different approach that fits the browser you already have open. It streams the file in 1 MB chunks through a Web Worker, indexes each line into IndexedDB, and shows only the rows currently on screen. Consequently, the file size that matters is your disk and browser quota, not your RAM, and a log that crashes an editor opens and stays responsive.

Why editors and grep struggle

The trouble with large logs comes down to how a tool holds the data. A text editor loads the entire file into memory so it can render, search, and scroll it, which means a file larger than the memory the browser or app will hand over simply cannot open. That is the wall you hit around a few hundred megabytes in most editors.

Loading everything versus loading what you see

Big Log Explorer never holds the whole file in memory. A Web Worker reads the file in 1 MB chunks, parses each line, and writes the parsed records to IndexedDB, a database that lives on disk rather than in the page heap.3 The viewer then uses virtual scrolling, keeping only the rows currently visible plus a small overscan buffer in the DOM, with a spacer sized to the total line count so the scrollbar stays proportional.4 Consequently, memory use stays roughly flat whether the file is fifty megabytes or five hundred. Grep, by contrast, does not exhaust memory but re-reads the file for every query2, so an interactive session of narrowing and re-narrowing pays the full scan cost each time. The indexed approach pays that cost once, up front, then answers every filter instantly.

Virtual scrolling is the other half of why it stays responsive. The viewer draws only the rows near the current scroll position, so the DOM holds a few hundred elements no matter how many millions of lines the file contains. That keeps the page fluid when you scroll, and it is why searching and filtering feel instant rather than fighting a giant rendered table. The index answers the query; the virtual scroll answers the display.

What you can do once it opens

Opening the file is only the start, and the point is what becomes possible afterward. Once the log is indexed, every interaction runs against the database rather than the raw text, so filtering feels immediate regardless of size. You can switch the level pills to isolate errors, type a term into the search box to match a request ID or a service name, and drag across the time chart to focus on the minutes around a spike. Each of these composes with the others, so an error pill plus a search term plus a time window narrows millions of lines to a handful.

Furthermore, the Patterns panel groups the file by message template, revealing which line dominates without any scrolling. Because all of this happens locally, there is no query latency and no round trip to a server. The experience is closer to a database console than to a text viewer, which is exactly what a large log needs to be useful rather than merely openable.

From open to answer in a few clicks

The indexed model means exploration is cheap, so you try things you would never bother with on a raw file. Jump to the ERROR pill, then refine with a service name, then drag the chart to a spike, each step taking a fraction of a second. Because nothing is re-scanned and nothing leaves the browser, the cost of poking at the data is effectively zero, which is what turns a daunting multi-gigabyte file into something you can actually interrogate.

Handling logs too big even for IndexedDB

There is still an upper bound, and it is worth understanding before you drop a truly enormous file. The limit is your browser IndexedDB quota, which on desktop browsers is typically several gigabytes but is not unlimited.5 A single log that exceeds that quota may fail to index fully, which is a different failure from an editor running out of RAM.

Splitting and streaming

When a file is genuinely too large for one session, the practical move is to narrow it before loading. Command-line tools split a file by line count or size, so you can carve a multi-gigabyte log into pieces that each fit comfortably. You can also pre-filter with grep to extract only the time range or service you care about, then open the smaller result in the tool for interactive analysis. Consequently, the workflow that scales best is coarse filtering on the command line followed by fine, iterative exploration in the browser. Furthermore, because the tool clears its IndexedDB database on tab reload, each piece starts from a clean slate, so you can work through several chunks for opening large logs in the browser without leftovers from a previous one interfering.

Reach for this when a log is too big to open comfortably in an editor and too tedious to explore with repeated grep passes. It suits post-incident analysis of a large exported log, auditing an access log that runs to millions of lines, or reading a verbose debug capture. Drop the file straight into Big Log Explorer and watch the indexing progress bar, since that single pass is what makes every filter after it instant, and the interactive filtering pays off quickly over a scrolling text view as long as the file fits your browser quota.

A 2 GB production log that will not open in your editor

Before
vim app.log   # freezes, then runs out of memory
After
Drop app.log onto Big Log Explorer; it streams in 1 MB chunks and stays responsive

Memory use stays roughly flat because only the visible rows are held in the DOM.

Iterating on a search that grep re-scans each time

Before
grep ERROR huge.log | grep user-service | grep timeout
After
Set the ERROR pill, search user-service, then add timeout, all against the indexed data

Each filter runs instantly because the file is indexed once rather than re-scanned per query.

A file larger than your browser quota

Before
Drop a 12 GB log; indexing may not complete
After
split -b 1G huge.log part_ then open one part at a time

Coarse split on the command line, fine exploration in the browser.

Sources for this section
  1. 1.

    microsoft/vscode, "VS Code crashes when opening large files," github.com, accessed July 2026. https://github.com/microsoft/vscode/issues/310440

  2. 2.

    Stack Overflow, "Performance issue with parsing large log files (~5gb) using awk, grep, sed," stackoverflow.com, 2011. https://stackoverflow.com/questions/7197500/performance-issue-with-parsing-large-log-files-5gb-using-awk-grep-sed

  3. 3.

    MDN, "Web Workers API," developer.mozilla.org, accessed July 2026. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API

  4. 4.

    CSS-Tricks, "Rendering Lists Using React Virtualized," css-tricks.com, accessed July 2026. https://css-tricks.com/rendering-lists-using-react-virtualized/

  5. 5.

    MDN, "Storage quotas and eviction criteria," developer.mozilla.org, accessed July 2026. https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria

FAQ

Big Log Explorer is designed for files up to 500 MB and has been tested beyond that. It streams the file in 1 MB chunks and stores parsed records in IndexedDB, so the whole file is never held in memory at once. The practical ceiling is your browser IndexedDB quota, typically several gigabytes on desktop. Beyond that, split the file first.

A text editor loads the entire file into memory before it can display it, so a file larger than available RAM fails to open. Big Log Explorer keeps the data on disk in IndexedDB and renders only the rows currently on screen through virtual scrolling. Memory use stays roughly flat regardless of file size, which is why a log that crashes an editor still opens here.

For a single search, grep is fine. For an interactive session of narrowing and re-narrowing, CapyToolkit's Big Log Explorer is faster, because it indexes the file once and then answers every filter, level pill, and time selection against that index instantly. Grep re-reads the file for each query. The tradeoff is the one-time indexing pass when you first open the file.

No. The file is read entirely in your browser through the File API, parsed in a Web Worker, and stored in a session-scoped IndexedDB database that is deleted when you close or reload the tab. No network request carries the file contents. This matters for large production logs, which often contain hostnames, tokens, and user data you do not want to send off your machine.

Narrow it before loading. Use a command-line tool to split the log into pieces by size or line count, or pre-filter with grep to extract only the time range or service you need, then open the smaller result in the tool. Coarse filtering on the command line followed by interactive exploration in the browser handles logs of essentially any size.

Because the file is indexed once, every search after that runs against the stored records instead of the raw text. The guide below shows how literal text search stays instant as you refine it, how to layer a search with the level pills and a time-chart selection, and how the Patterns panel helps when you cannot name the exact message you are looking for.

You know the request ID and need its lines. Searching a log is the most common thing anyone does with one, yet on a large file the obvious tools make it slow or clumsy. Grep re-scans the whole file each time you refine the query1, an editor chokes before you can even open the search box, and a log service costs money and sends your data away. Big Log Explorer indexes the file once, then searches the indexed records in your browser2, so matching stays instant no matter how many times you refine. Type a term into the search box and the viewer filters to lines containing it, live. Because the search combines with the level pills, the time chart, and the Patterns panel, a plain text match becomes the starting point for real narrowing rather than the end of it.

Text search that stays instant

The defining feature of searching in Big Log Explorer is that speed does not degrade as you refine. When the file is indexed, a search runs against the records already in IndexedDB rather than re-reading the file2, so each refinement returns immediately. That changes how you work. Instead of composing one perfect grep and waiting, you type a rough term, watch the results shrink, then add or change words to home in. For a several-hundred-megabyte log, the difference between an instant filter and a multi-second scan per query is the difference between exploring and waiting.

Furthermore, the viewer keeps virtual scrolling active over the filtered results3, so even a search that still matches hundreds of thousands of lines scrolls smoothly. Because nothing leaves the browser, there is no network latency between your query and the answer either. Search here feels interactive in a way that a scan-per-query tool cannot match on a large file.

Why indexing beats a live scan

The instant feel comes from doing the expensive work once, up front, rather than per query. When you open the file, a Web Worker reads it in 1 MB chunks and writes each parsed line to IndexedDB4, so by the time you search, the records are already structured and addressable. A grep pass, by contrast, starts from raw bytes every time1, which is why each refinement costs a full scan. The chunked read also leans on the platform streaming model rather than buffering the whole file, since a readable stream lets consumers take data incrementally instead of holding all of it in memory5. Paying the indexing cost once is what lets every later search return in a blink, and it is the same trick that keeps filtering and the time chart fast.

Layering search with level and time

A raw text search is powerful, but its real strength appears when you stack it with the other filters. On its own, a search for a service name might still return tens of thousands of lines across an entire day. The moment you add a severity or a time constraint, that set collapses to something readable.

The filters compose

Each control in Big Log Explorer narrows the same indexed set rather than starting a new query. Select the ERROR pill and your search now matches only error-class lines mentioning the term. Drag the time chart across a spike and it further restricts to that window. The Patterns panel updates alongside, showing which templates dominate the filtered view. Consequently, a workflow emerges: search to find the relevant subject, add a level to focus on failures, add a time window to bound the incident, then read the few dozen lines that remain. Furthermore, because every step is reversible with a click, you can widen one constraint without losing the others, which makes exploring a log feel like adjusting dials rather than rewriting a command each time.

The composition also survives mistakes gracefully. If you add a time window that is too tight and the results vanish, widening it one drag brings everything back, because each filter is layered on the same set rather than baked into a fresh query. That safety is why people experiment with filters here when they would never risk a fragile piped command on a live log, where one typo can silently drop the lines you needed.

Finding what you cannot name exactly

Sometimes you do not know the exact string to search for, only that something is wrong. A plain text search assumes you can name the needle, which is not always true at the start of an investigation. This is where the Patterns panel complements search rather than competing with it.

Let clustering surface the term

The Patterns panel groups the file by normalized message template, so the messages that repeat most rise to the top regardless of whether you knew to look for them. Reading the top templates often reveals the exact phrase worth searching, whether a connection reset, a specific exception class, or a recurring warning you had not considered6. From there you click Filter on the template to pull those lines into the viewer, or copy a distinctive phrase into the search box to match variants the template collapsed.

Consequently, clustering and search form a loop, because the panel tells you what to search for and search then isolates the specific lines. Try both moves with instant log search in the browser on your own file, searching for what you already suspect, then checking the Patterns panel for what you might have missed. Because both run against the same local index, moving between them costs nothing, and you converge on the relevant lines even when you started with only a vague symptom.

Use search whenever you need specific lines out of a large log: tracing one request ID across services, pulling every mention of a user or host, or confirming whether an error string appears at all. It shines when you expect to refine the query several times, since each refinement is instant. Pair it with the level pills and time chart to bound the results quickly.

Tracing one request across a large log

Before
grep 7f3a9c2e big.log   # scans the whole file
After
Type 7f3a9c2e in the search box; the viewer filters live to matching lines

Refining the term costs nothing because the file is already indexed.

You are not sure what to search for

Before
No obvious string to grep for yet
After
Open the Patterns panel, read the top templates, then search the phrase that stands out

Clustering surfaces the term; search isolates the lines.

Too many matches for a common word

Before
Searching timeout returns 80,000 lines
After
Add the ERROR pill and a time-chart window to cut it to a readable set

Filters compose against the same indexed data.

Sources for this section
  1. 1.

    dmtrKovalenko/fff, "fff — Fast File Finder," github.com, accessed July 2026. https://github.com/dmtrKovalenko/fff

  2. 2.

    MDN, "IndexedDB API," developer.mozilla.org, accessed July 2026. https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API

  3. 3.

    CSS-Tricks, "Rendering Lists Using React Virtualized," css-tricks.com, accessed July 2026. https://css-tricks.com/rendering-lists-using-react-virtualized/

  4. 4.

    MDN, "Using Web Workers," developer.mozilla.org, accessed July 2026. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

  5. 5.

    WHATWG, "Streams Standard," whatwg.org, accessed July 2026. https://streams.spec.whatwg.org/

  6. 6.

    logparser, "Drain," logparser.readthedocs.io, accessed July 2026. https://logparser.readthedocs.io/en/latest/tools/Drain.html

FAQ

No. Big Log Explorer indexes the file into IndexedDB when you open it, and the search runs against those indexed records. Refining or changing the query filters the existing index rather than re-reading the file, so each change returns immediately. That is what makes iterative searching practical on a several-hundred-megabyte log, where a scan-per-query tool would pause on every edit.

Yes, and that is the intended workflow. The search box, the level pills, and the time-chart selection all narrow the same indexed set, so they compose. CapyToolkit's Big Log Explorer lets you search for a service, add the ERROR pill to see only its failures, then drag the time chart to bound the window. Each control further restricts the results, and removing one restores the rest.

The search box matches lines that contain your text, which covers the large majority of log searches. When you need pattern-based grouping rather than a literal match, the Patterns panel already normalizes variable parts like IDs and IPs into placeholders, so lines that differ only by those values cluster together. Between literal search and template clustering, most investigative needs are covered without writing a regex.

Start with the Patterns panel. It groups the log by message template and ranks templates by count, so the dominant messages surface even when you cannot name them. Reading the top templates usually reveals the exact phrase worth searching. Click Filter on a template to pull its lines into the viewer, or copy a distinctive phrase into the search box to explore further.

Entirely locally. The file is read in your browser, parsed in a Web Worker, and stored in a session-scoped IndexedDB database. Every search runs against that local index, and no query or file content is sent anywhere. The database is deleted when you close or reload the tab, so a searched log leaves nothing behind and never travels off your machine.

Supported log formats

Format detection happens per line rather than per file, so a single log can freely mix timestamps, levels, and payloads from different emitters without confusing the parser. This lets you drop in a real production export that interleaves application logs, access logs, and the occasional raw exception stack trace. Three structured formats are recognised automatically; any line that matches none of them is kept as raw text so nothing disappears from the viewer.

  • JSON Lines (JSONL).6 Any line starting with { is parsed as JSON. Timestamp fields (timestamp, time, ts, @timestamp, datetime) and severity fields (level, severity, lvl) are extracted automatically. This covers Bunyan, Winston, Pino, Logstash, and most structured logging formats.
  • ISO 8601 log lines. Lines starting with a date-time string in ISO 8601 format are recognised.7 They may be optionally followed by a bracketed level like [ERROR]. This covers the default output of most application loggers including Log4j, syslog with ISO timestamps, and cloud provider log exports.
  • Common Log Format.8 The format used by Nginx access logs and many web-server access logs.9 HTTP status codes map to severity: 5xx is error, 4xx is warn, everything else is info.

How each format is recognised

The reader tries the formats in a fixed order for every line, checking the cheapest rule first to keep overhead negligible even across tens of millions of lines. JSON Lines wins if a line opens with a curly brace and parses as valid JSON; ISO 8601 wins if the leading characters encode a date and time; Common Log Format wins if the line matches the request-and-status shape used by web servers.

A fourth rule recognises lines whose leading characters encode a day-named-month-year timestamp such as 15-Mar-2026 or 15/Mar/2026, parsing the timestamp and treating the line as info-level. Each branch pulls out the same three fields, a timestamp, a severity level, and a message, so the viewer can sort, filter, and chart lines regardless of which producer emitted them; lines that win none of the rules are kept as raw text and still appear in the viewer and the pattern panel.

Choosing between overlapping formats is handled by specificity rather than by file extension, so a log that begins as plain Common Log Format but suddenly switches to JSONL mid-stream is indexed correctly without any manual configuration. The formats list is intentionally small: it covers the majority of operational logs while keeping the per-line detection fast enough to sustain line rates of hundreds of thousands per second inside a Worker thread.

Formats the rules cover beyond the big three

Two formats the named list never mentions still parse cleanly. The combined log format extends Common Log Format with the referrer and user-agent fields after the status code,8 and because the CLF rule matches through the status field, those trailing fields never break the match: a combined line charts and level-maps exactly like a plain one. Syslog lines in the modern RFC 5424 shape begin with an ISO timestamp, and the ISO rule recognises them for exactly that reason, since it keys on the leading date-time rather than on the format's name. The big three were always a simplification of what the rules accept.

The honest boundary is classic syslog. Lines that lead with a month-first timestamp and no year, the RFC 3164 shape, match none of the rules and land as raw text: fully visible in the viewer under the ALL pill, counted in the pattern panel, and absent from the time chart because no timestamp parsed. Lines whose severity parses as other likewise appear under ALL only, because the pill row carries no OTHER entry. Neither behavior loses data; both only narrow where the chart and the pills can take you. A raw-text file still opens, indexes, and clusters normally.

Pattern clustering

The Patterns panel groups log lines by template so you can see, at a glance, which messages dominate a noisy file. Each message is normalised by replacing variable parts, including URLs, IP addresses, UUIDs, hex strings, file paths, floats, and integers, with placeholders such as <url> and <n>; the curly braces in JSON keys are replaced by a single placeholder too, so two otherwise identical lines with different IDs collapse into one cluster. Lines that produce the same normalised string are counted together.

How the patterns filter the viewer

The top 50 patterns by count are shown in the panel, each row carrying the template and the number of lines it matched. The Filter button on a row narrows the log viewer to lines matching that template, and that filter combines with any active text search or level filter already in place, so you can isolate one recurring error across a five-hundred-megabyte file without downloading anything. The cluster counts themselves are computed once, over the whole file, during indexing; they stay whole-file counts while the viewer narrows, and the Worker that built them is terminated as soon as indexing completes.

Privacy

Log files regularly contain hostnames, user IDs, request paths, and authentication tokens, which is why the entire pipeline of file reading, line parsing, IndexedDB indexing, and filtering is designed to run inside your browser tab. No data reaches any server. A dedicated Web Worker reads and parses the file on a background thread without interfering with the user interface, so the heavy lifting never blocks the tab you are reading.2

Where the data is stored and when it disappears

The parsed records are written to an IndexedDB object store that lives only for the lifetime of the page, scoped to the current tab's origin. The IndexedDB database is deleted when you close or reload the tab, so nothing written during one session is carried into the next. The resulting database is local to your machine and is never uploaded, synchronised, or shared across origins, because IndexedDB follows a same-origin policy and the tool performs no network requests with file contents at any point.3

Time-chart navigation for incident triage

During an incident, narrowing down when a problem started is often the first step toward finding what caused it. The time-series chart at the top of the log viewer plots line counts per time bucket across the full span of the log file. A spike in error-level lines at a specific time stands out visually even before you read a single log entry. Dragging across the chart to select a time window immediately filters the log viewer to lines from that period, letting you read a few hundred lines in context rather than scrolling through millions. Clicking outside the highlighted region restores the full log.

Combining the time filter with a level filter and a text search lets you isolate a specific error class within a short window with a few clicks. For example: select the five-minute window around a spike, switch the level pill to ERROR, and search for a service name. The viewer then shows only error-level lines mentioning that service in those five minutes. This layered filtering needs no query language. The pattern list stays a whole-file view while you work, so the template that dominates the selected window is found by reading the narrowed viewer and refining the search, not by watching pattern counts move. Because the entire log is stored locally in IndexedDB, all filtering happens on your machine regardless of file size, which keeps iterative narrowing practical for logs several hundred megabytes long.

What search can and cannot do

The search box matches a plain, case-insensitive substring against each raw line after a half-second debounce, and the match combines with the level pill, the active pattern, and the selected time window. Each added filter narrows the same line set rather than starting the search over. Searching for an error string with the ERROR pill pressed is the fastest route from a noisy file to one failure class, because the substring names the failure and the pill removes everything the failure is not. Nothing you type needs escaping or quoting, which keeps the tool honest about being a viewer first.

Every character you type is literal. There are no regular expressions, no wildcards, and no boolean operators, so a search for error.*timeout looks for that exact run of characters rather than a pattern. The narrowed result lives in the viewer and nowhere else: there is no export or download of the filtered lines, no way to save the selection to disk from this tool. When you need the narrowed set somewhere else, the reproducible artifact is the source file plus your filter choices, and re-creating the view is a few clicks. The viewer is the destination by design.

Narrowed the Incident Down Checklist

  • Spike located on the time-series chart Drag-select the window around the spike before doing anything else — everything else filters within that selection.
  • Level pill switched to ERROR (or WARN) Combines with the time window so you only read lines at the severity that actually matters for the incident.
  • Text search narrowed to a service or component name Layering search on top of the time and level filters isolates one failing component out of a noisy file.
  • Pattern panel checked for the dominant template The top pattern by count in the filtered window is usually the root error worth reading in full.

Drop your own log file above and work through this checklist to narrow down an incident.

Finding Every Error in a Log File

An incident usually starts with one question for the log: where are the errors? The guide below explains how the explorer folds fatal, critical and other error-class levels, along with 5xx status codes, into one ERROR pill and 4xx statuses into WARN, then how the time chart shows when the failures started and how the Patterns panel shows which error dominates.

Finding the errors is the whole point. Something broke, and the log holds the evidence, but the failures are buried under thousands of routine info lines that mean nothing to your current problem. The naive approach, scrolling or grepping for the word error, misses the fatals, the crits, and the 500s that never spell it out.12

Big Log Explorer solves this by normalizing every severity it reads into an ERROR pill that means all error-class messages at once. One click isolates them across the entire file, whether they arrived as a JSON level field, a bracketed ISO level, or an HTTP status code from an access log. Consequently, a fatal from one service and a 502 from another appear side by side under the same filter. From that error view, the time chart and the Patterns panel tell you when the failures clustered and which ones dominate.

One pill for every error dialect

The reason grepping for error falls short is that failures do not agree on a word. A Node service might log fatal, a Python service critical, a Go service err, and an access log nothing at all beyond a 500 status.31 Searching one keyword catches one dialect and silently drops the rest, which is how a real failure hides in plain sight during an incident.

Fatals, crits, and 500s all count

Big Log Explorer normalizes as it indexes, folding fatal, crit, and critical and anything starting with err into a single error class, and mapping 5xx access-log statuses to the same class.32 The ERROR pill then filters on that normalized class rather than on any literal string. Consequently, clicking it once surfaces every server-side failure in the file regardless of which vocabulary produced it. Furthermore, because the normalization happens during indexing, the filter stays instant even on a large log, since it selects pre-classified records from IndexedDB rather than scanning text.45 You get a complete error view without having to remember every synonym a given framework might have used, which is exactly what you want when something is on fire.

The class is also stable across formats, which is the part a flat text search cannot offer. A JSON app log, an ISO syslog line, and a CLF access log each express severity differently, yet after normalization they share the same error bucket, so the ERROR pill treats them as one stream. That is what makes a mixed export, where app and access lines are interleaved, sortable by failure rather than by origin.

When the errors started

Knowing which lines are errors is half the answer, and knowing when they began is the other half. The time chart plots line counts per time bucket across the whole file, and with the ERROR pill active it plots only the errors.6 A healthy service shows a flat, low error baseline, so a failure announces itself as a sudden vertical spike that you can see before reading a single line.6 That visual cue is often the fastest way to locate an incident in a long log.

Dragging across the spike filters the viewer to those minutes, so you read the errors in the window where they clustered rather than scattered through the day. Because the chart and the pill share the same indexed data, switching between them is instant.4 Furthermore, the shape of the spike itself is informative, since a sharp cliff suggests a deploy or a dependency dropping, while a slow ramp suggests a leak or a queue filling over time.

Pairing the chart with the Patterns panel

The chart tells you when, but the Patterns panel tells you what, and the two read best together. Once you drag across the spike to lock the time window, the panel ranks the error templates inside that window, so the failure that caused the cliff sits at the top rather than buried in the surrounding noise.7 That pairing turns a vague sense of when something broke into a specific, countable failure you can act on, without leaving the ERROR view.

Which error dominates

A spike of errors is rarely a single failure, but usually one dominant failure plus a scatter of unrelated noise. Reading them in order tells you little about which one matters, because a loud, frequent error and a rare, incidental one look the same line by line. The Patterns panel answers the question that raw reading cannot: which error is actually driving the incident. Catching every error severity in logs surfaces the dominant failure across services that spell it differently, because the ERROR pill folds fatal, crit, and 5xx into one filter.

Ranking errors by frequency

With the ERROR pill active, the Patterns panel clusters the error lines by normalized template and ranks them by count.7 The template that tops the list is, by definition, the failure happening most, and its count tells you the scale. Consequently, you move from a wall of red lines to a ranked list of distinct error types in one glance. Clicking Filter on the top template pulls just those lines into the viewer, and adding the time window confirms whether that error is the one that spiked. Furthermore, a second template rising unusually high often reveals a knock-on failure, the downstream effect of the first, which helps you separate cause from symptom without guessing. That ranking is frequently the difference between a fast recovery and chasing the wrong thread.

Turn to this the moment a service misbehaves and you have its log. Drop your export into Big Log Explorer and click the ERROR pill first, before you read a single line, to see the full failure count regardless of which vocabulary each service used. The time chart shows when the failures started, and the Patterns panel ranks which one dominates. It works equally on application logs with textual levels and access logs where the severity is an HTTP status, so a mixed incident export stays readable.

Errors that do not use the word error

Before
grep -i error app.log   # misses fatal, crit, and 500s
After
Click the ERROR pill; every error-class line appears regardless of wording

Normalization folds fatal, crit, err, and 5xx into one class.

Locating when the failures began

Before
Scrolling a day of logs to find the spike
After
With ERROR active, read the time chart and drag across the spike

The chart plots only error lines, so the incident is visible before reading.

Deciding which error to fix first

Before
Hundreds of red lines, unclear which matters
After
Open the Patterns panel to rank error templates by count

The top template is the failure happening most.

Sources for this section
  1. 1.

    Python Software Foundation, "logging — Logging facility for Python," docs.python.org, accessed July 2026. https://docs.python.org/3/library/logging.html

  2. 2.

    R. Fielding, M. Nottingham, and J. Reschke, "HTTP Semantics," RFC 9110, IETF, June 2022. https://datatracker.ietf.org/doc/html/rfc9110

  3. 3.

    Apache Software Foundation, "Levels — Apache Log4j 2," logging.apache.org, accessed July 2026. https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Level.html

  4. 4.

    MDN, "IndexedDB API," developer.mozilla.org, accessed July 2026. https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API

  5. 5.

    MDN, "Using Web Workers," developer.mozilla.org, accessed July 2026. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

  6. 6.

    Grafana Labs, "Loki LogQL documentation," github.com, accessed July 2026. https://github.com/grafana/loki

  7. 7.

    logpai, "Drain3: A robust streaming log template miner based on the Drain algorithm," github.com, accessed July 2026. https://github.com/logpai/Drain3

FAQ

Click the ERROR pill. Big Log Explorer normalizes severities during indexing, folding fatal, crit, critical, and anything starting with err into one error class, and mapping 5xx access-log statuses to it as well. The pill filters on that class rather than a literal keyword, so it catches every error-class line regardless of which word or status a given service used.

Yes. For Common Log Format and Combined Log Format lines, CapyToolkit's Big Log Explorer maps the HTTP status to a level, so any 5xx becomes error and any 4xx becomes warn. That means a 500 or 502 in an access log appears under the ERROR pill alongside application errors, letting a mixed export of app and access logs be triaged with a single filter.

Activate the ERROR pill and read the time chart, which then plots only error-class lines per time bucket across the file. A failure shows up as a spike above the flat baseline, often visible before you read any line. Dragging across the spike filters the viewer to those minutes, so you read the errors in the window where they clustered.

Let frequency guide you. With the ERROR pill active, the Patterns panel clusters error lines by template and ranks them by count, so the failure happening most sits at the top. Click Filter on it to isolate those lines. A second template rising sharply often signals a knock-on effect, which helps you tell the root cause from its downstream symptoms.

Yes. The entire process runs in your browser: the file is read with the File API, parsed in a Web Worker, and stored in a session-scoped IndexedDB database. The ERROR pill, time chart, and Patterns panel all operate on that local index, and nothing is sent to a server. The database is deleted when you close the tab, so the log leaves no trace.

Sources
  1. 1.

    World Wide Web Consortium, "File API," w3.org, August 2026. https://www.w3.org/TR/FileAPI/

  2. 2.

    Mozilla Developer Network, "Using Web Workers," developer.mozilla.org, accessed June 2026. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

  3. 3.

    Mozilla Developer Network, "IndexedDB API," developer.mozilla.org, April 2025. https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API

  4. 4.

    Kubernetes, "Logging Architecture," kubernetes.io, accessed September 2026. https://kubernetes.io/docs/concepts/cluster-administration/logging/

  5. 5.

    Docker, "docker container logs," docs.docker.com, accessed September 2026. https://docs.docker.com/reference/cli/docker/container/logs/

  6. 6.

    Wikipedia, "JSON streaming," en.wikipedia.org, accessed June 2026. https://en.wikipedia.org/wiki/JSON_streaming

  7. 7.

    ISO, "ISO 8601-1:2019 - Date and time — Representations for information interchange — Part 1: Basic rules," iso.org, February 2019. https://www.iso.org/standard/70907.html

  8. 8.

    Wikipedia, "Common Log Format," en.wikipedia.org, accessed June 2026. https://en.wikipedia.org/wiki/Common_Log_Format

  9. 9.

    Nginx, "Module ngx_http_log_module," nginx.org, accessed June 2026. https://nginx.org/en/docs/http/ngx_http_log_module.html

FAQ

No. CapyToolkit reads the file entirely in your browser using the File API, and a Web Worker processes it locally before writing the parsed records to a session-scoped IndexedDB database in your browser tab. No network request containing file contents is made at any point, so nothing you load ever leaves your machine.

The tool is designed for files up to 500 MB and has been tested beyond that. It streams the file in 1 MB chunks so the full file is never held in memory at once. The main limit is your browser's IndexedDB quota, which is typically several gigabytes on desktop browsers.

Three formats are auto-detected per line: JSON Lines (JSONL), ISO 8601 timestamp log lines used by most structured loggers, and Common Log Format used by Apache and Nginx access logs. Lines that match none of these are stored as raw text and still appear in the viewer and patterns panel.

Each line's message is normalised by replacing variable parts like IDs, IPs, UUIDs, timestamps, and numbers with placeholders. Lines that normalise to the same template are grouped into one pattern. The count shows how many times that pattern appeared, and the Filter button on a pattern row narrows the viewer to lines matching that template.

No. The IndexedDB database used for indexing is deleted when you close or reload the tab. Each session starts fresh with no data from a previous run.

The chart only plots lines where a timestamp was successfully parsed. Log formats that do not include a date and time, or use a format the tool does not recognise, are stored with a zero timestamp and excluded from the time graph. They still appear in the log viewer and pattern panel.