User Guide

Everything you need to know to get the most out of the Klunk Log Viewer.

Quick Start

  1. Launch the application — the Import Data dialog opens automatically.
    You can always get to import data dialog by clicking the Import button in the Log Manager toolbar (or pressing Ctrl+I).
  2. Pick a source type — File, SFTP, Kubernetes, Database, or URL — and load it.
    Source type tabs for types other than file or url are disabled in the Import data dialog by default. These datasources can be added through the Settings dialog.
  3. The viewer attempts to auto-detect the log format (pattern) and opens in a new tab.
    If no existing pattern matches, a catchall format is used.
  4. Type a query in the filter bar (e.g. level = 'ERROR') and press Enter.
  5. Drag the time-slider thumbs (left edge of the table) to narrow to a time window.
Log viewer showing a loaded file with level colors, a query filter, and the time slider

Importing Logs

Click Import in the Log Manager toolbar (or press Ctrl+I) to open the Import Data dialog. It has one tab per source type — File, SFTP, Kubernetes, Database, and URL.

Import Data dialog with File/SFTP/Kubernetes/Database/URL tabs, browse/drag-drop area, and File Type / Pattern / Merge files options

Local Files

  1. Select the File tab.
  2. Click Browse… or drag and drop one or more files onto the drop area.
  3. Choose a File Type (Generic, or a specific type) and a Pattern — leave as Auto Detect to let the app pick the best match.
  4. Check Merge files to combine multiple selected files into one chronological view immediately on import (equivalent to importing them separately and then using Merge in the Log Manager).
  5. Click Import.
For CSV files, you'll be prompted to choose the delimiter (comma, tab, pipe, semicolon, or custom). You will also be able to select if first row should be treated as a header row to define the column mames

External Databases

Supported drivers: MySQL, PostgreSQL, ClickHouse, Oracle, SQLite, and any custom JDBC driver registered in the Driver Editor.

  1. Select the Database tab.
  2. Pick a saved datasource, or create one via the DB Datasource Editor (host, port, database, credentials).
  3. Choose the target table and a Log Pattern describing its columns.
  4. Click Import.
The external table is queried once and cached in the internal SQLite store. Changes on the source side aren't reflected until you Reload.

Kubernetes Logs

  1. Select the Kubernetes tab.
  2. Pick a saved cluster connection (configured via the Kubernetes Datasource Editor — paste a kubeconfig or point at a config file).
  3. Choose a namespace and pod (or a pod-name filter for multi-pod streaming), then import.
Multi-pod imports open a Merged View automatically, with each pod color-coded.

SFTP Remote Files

  1. Select the SFTP tab.
  2. Pick a saved connection, or create one via the SFTP Datasource Editor (host, port, username, password, or an SSH private key — optionally the app-wide default key set in Settings).
  3. Browse the remote filesystem and select a file to import.

The file downloads to a local temp cache and opens in the standard viewer; large files stream page by page.

HTTP / URL Sources

  1. Select the URL tab.
  2. Paste an HTTP or HTTPS URL that returns plain-text log data.
  3. Select a log pattern and import.

Request Options — Headers & Pagination

Click Request Options… on the URL tab to add custom request headers, a POST body, and multi-page fetching for APIs that don't return everything in one response.

URL Request Options dialog with a Payload/Body text area, a Name/Value Headers table with Add/Remove buttons, and an Enable Pagination checkbox with Type and Param Name fields

Payload / Body

Only sent with POST requests (set the method on the URL tab first). A body starting with { or [ automatically gets a Content-Type: application/json header. Reference the current pagination value with ${paramName}, matching whatever you type into Param Name below:

{"query": "level:ERROR", "page": ${page}, "pageSize": 100}

Headers

Click Add to insert a row — the Name cell is focused immediately so you can type right away. Press Enter, Tab, or type : to jump from Name to Value. Headers are sent with every request, including every page of a paginated fetch:

Authorization: Bearer eyJhbGciOi...
Accept: application/x-ndjson
X-Api-Key: 3f29a1c0-...

Pagination

Check Enable Pagination and pick a Type. Param Name is the query parameter (GET) or ${placeholder} key (POST payload) that carries the page value; Page Size and Max Pages cap how far the import will keep fetching — it also stops early the moment a page comes back empty.

Type What it sends Stops when
PAGE Param Name = a page number, starting at 1 and incrementing each request A page returns no rows, or Max Pages is reached
OFFSET Param Name = a row offset, starting at 0 and increasing by Page Size each request A page returns no rows, or Max Pages is reached
CURSOR Param Name = the cursor value read out of the previous response's JSON at Cursor JSON Path (dot-separated, e.g. meta.next_cursor) The cursor path comes back empty or missing, or Max Pages is reached

Example — PAGE, GET request. URL https://api.example.com/logs, Method GET, Param Name page, Page Size 100, Max Pages 5:

GET https://api.example.com/logs?page=1
GET https://api.example.com/logs?page=2
GET https://api.example.com/logs?page=3
...

Example — OFFSET, POST request. Method POST, Param Name offset, Page Size 500, Payload:

{"query": "level:ERROR", "offset": ${offset}, "limit": 500}

sends bodies with offset equal to 0, then 500, then 1000, and so on for up to Max Pages requests.

Example — CURSOR, GET request. Param Name cursor, Cursor JSON Path meta.next_cursor. If page 1's response body is:

{"items": [...], "meta": {"next_cursor": "abc123"}}

page 2 is fetched as ...?cursor=abc123; fetching stops as soon as a response has no meta.next_cursor value.

Headers and pagination settings are saved with the URL's MRU entry, so re-importing (or double-clicking) a previously used URL reuses the same request options automatically.

Log Manager Dashboard

The Log Manager is the central hub. It lists every open log view with its name, error/warning summary, and date range.

Log Manager with one open viewer, its info summary, and the toolbar row (query filter, Filter Selected, Selected: actions, Group)
Column Meaning
Log Window The file name or source description
Info Error/warning counts and total row count for that view
Date Range Earliest and latest timestamp in the data

Toolbar actions:

Docking and Undocking

Every new view opens as a tab inside the main Log Docker by default.

Window Layouts

Option Effect
Cascade Windows Stack windows with an offset so each title bar is visible
Tile Windows Fill the screen evenly
Minimize All Windows Iconize every undocked window
Show All Windows Bring every window to the front and un-minimise it

Merging Logs

Merging lets you view entries from several sources in a single chronological stream — ideal for correlating events across microservices.

  1. In the Log Manager, check two or more windows.
  2. Click the merge icon under Selected:. A new Merged View tab opens.
  3. Each source gets a distinct color. The Source column shows every row's origin.
If you reload a source file, use Reload in the merged viewer to rebuild with fresh data.
Right-click any row in a merged view → Change Color to reassign a source's color. The time-slider markers update instantly.
Don't need a combined stream? Keep the logs in separate windows and use Synch All to scroll them all to the same time.

Grouping Windows

Groups tag a set of open windows with a shared name and color, so they can be saved and reloaded together later, or analyzed as a set.

  1. Select two or more windows in the Log Manager and click the group icon under Selected: (or Ctrl+G).
  2. In Group Windows, enter a name (or pick an existing group to reuse its color), choose a color, and leave Save group for later reloading checked to persist the group to disk immediately.
  3. Click Set Group, or Clear Group to remove the tag from the selected windows.
Group Windows dialog with a group name, color swatch, and Save group for later reloading checkbox
Leaving the checkbox checked (the default) is equivalent to also running Save Group afterwards — the group's current windows are written to disk immediately so they can be reloaded later from the Import dialog's Groups tab. Uncheck it to tag windows for the current session only, without persisting them yet.

Once at least one group exists, the Log Manager shows Save Group and Analyze Group buttons:

Analyze Group dialog with a Group dropdown and Analyze / Cancel buttons

The resulting Group Analysis report aggregates severity counts and an hourly issue-frequency chart across every file in the group, plus a per-file breakdown table (rows, errors, warnings). Additional tabs cover Issues & Clusters and Token Linkage for deeper cross-file correlation.

Group Analysis report: global severity pie chart, aggregated issues-over-time bar chart, and a per-file rows/errors/warnings table
Like the single-file Log Analysis report, group analysis can be redacted, copied as markdown, or saved to a file — handy for pasting into an AI assistant or a ticket.

The Log Viewer

Table Overview

Column Notes
Timestamp Drives the time slider
Level Color-coded: ERROR, WARN, INFO/other in the default color
Thread Originating thread
Message Full log message; wraps for multi-line entries
Source Merged views only — origin file or pod

Row Detail View

Double-click a row (or press Enter) to open the Row Detail panel. It shows every field fully wrapped, with one-click copy for individual fields or the entire entry.

Filtering Logs

The filter bar at the top of every viewer accepts SQL-style WHERE expressions. Press Enter to apply; click the X next to it, press Ctrl+Shift+L, or press Escape in the field to clear (Escape first undoes an edit you haven't applied). Previously used filters appear in the dropdown, and the row count updates immediately to show how many entries match.

Filter Query Syntax

Column names match the pattern's field names: timestamp, level, message, thread, and source (merged views).

Equality and inequality

level = 'ERROR'
thread = 'http-nio-8080-exec-1'
level != 'DEBUG'

Set membership (IN / NOT IN)

level in ('ERROR','WARN')
level not in ('ERROR','WARN')

Pattern matching (LIKE / NOT LIKE)

% matches any sequence; _ matches exactly one character.

message LIKE '%NullPointerException%'
logger  LIKE 'com.example.%'
message NOT LIKE '%health%'

Comparison and range (timestamps and numbers)

timestamp >= '2026-06-01T08:00:00Z'
timestamp <  '2026-06-01T09:00:00Z'
timestamp BETWEEN '2026-06-01T08:00:00Z' AND '2026-06-01T09:00:00Z'
Accepted timestamp formats:
  • ISO-8601 with offset: 2026-06-03T04:15:48Z or 2026-06-03T04:15:48.000Z
  • ISO-8601 with offset: 2026-06-03T04:15:48+05:30
  • Display format: 2026-06-03 - 04:15:48.000
  • Display format (no separator): 2026-06-03 04:15:48

Boolean logic — AND / OR / parentheses

AND binds tighter than OR. Use parentheses to group sub-expressions.

level = 'ERROR' AND thread = 'main'

(message LIKE '%timeout%' OR message LIKE '%connection refused%') AND level = 'ERROR'

-- Slow DB calls in one package:
logger LIKE 'com.example.db.%' AND message LIKE '%ms%' AND level != 'DEBUG'

Filter-Out (Exclusion)

Use Filter Out to hide noise without changing the main filter.

  1. Click Filter Out in the toolbar.
  2. Enter exclusion rules using the same syntax as the main filter.
  3. Apply. Matching rows are hidden.
-- Exclude health-check and metric noise:
message LIKE '%actuator/health%' OR logger LIKE 'io.micrometer.%'
Filter-out rules persist with the session and are shown in a distinct color in the toolbar when active.

Search and Find

Find (Aa field, or Ctrl+F) highlights all occurrences of a text string within the visible rows.

Action Shortcut
Open find bar Ctrl+F
Find next F3
Find previous Shift+F3
Toggle case-sensitive find Click the Aa toggle next to the field
Clear Click the X next to the field
Find searches the rendered cell text, not the raw stored value — display-formatted timestamps (e.g. 2026-06-03 - 04:15:48.000) are searchable as displayed.

Turn the find text into a filter: click the magnifier button beside the find field (tooltip Add filter for find text) to build a query that matches the current find text across every column — col1 LIKE '%text%' OR col2 LIKE '%text%' … — apply it to the filter bar, and clear the find field. Where Find only highlights matches in the loaded rows, this narrows the table to matching rows and runs over the full dataset, including SQLite-paged files.

Find bar with 'Missing' typed; the magnifier button beside it is tooltipped 'Add filter for find text'
The magnifier beside the find field filters every column for the find text.

Time Slider

The vertical slider on the left edge of the table represents the full time range of the loaded (and filtered) log. It only appears for patterns that include a timestamp column.

Element Meaning
Top / bottom thumb Upper and lower bounds of the selected time range
Red bars Rows with level ERROR or FATAL
Orange bars Rows with level WARN
Colored ticks Bookmarked rows, in their bookmark color
Shaded band The currently visible portion of the table
The selected time range is saved with the session and restored on next open.

Synch All (Line Up Open Logs by Time)

When you'd rather keep logs in separate windows than merge them, Synch All in a viewer's toolbar scrolls every other open log to the moment you're looking at.

To mark the same moment in every log rather than just scroll to it, use Bookmark Time.

Bookmarks and Highlights

Bookmarks let you pin important rows for navigation, review, and later filtering.

Creating a bookmark: right-click a row → Bookmark (uses the last-used color), or Bookmark [choose color] to pick a color from the palette (10 colors). A colored marker appears on the row background and on the time slider.

Right-clicking an already-bookmarked row shows options to manage it:

Row context menu with Bookmark, Bookmark [choose color] color palette, Bookmark time…, Copy, View, Filter, Filter Out, Annotate, Select All
Action How
Jump to next bookmark Click ↓ in the viewer header, or Ctrl+Down
Jump to previous Click ↑, or Ctrl+Up
Show bookmarks only Toggle the bookmark button — non-bookmarked rows are hidden

Bookmark Time (Time Correlation)

Bookmark time… (on the row context menu) bookmarks every row whose timestamp falls within a configurable leeway of the selected row, in every open log (including this one) or in a chosen group. It's the fastest way to line up related events across several logs that don't share a common request ID.

  1. Right-click the row of interest → Bookmark time…. If several rows are selected, the window runs from the earliest to the latest of them.
  2. Choose a Leeway window (±5 ms up to ±1 min, default ±50 ms, or a custom value).
  3. Pick a Bookmark color.
  4. If any open windows have been grouped, a Target dropdown lets you limit the bookmarks to one group instead of All Logs.
  5. Click Bookmark.

The chosen color gets an automatic comment recording the source row and leeway, so you can tell later where those bookmarks came from.

Bookmark time dialog with a leeway dropdown and a row of bookmark color swatches

Bookmark Filters

Toggle the bookmark button in the viewer header to switch on Show bookmarks only, which hides every non-bookmarked row. From there, use Bookmark Filters (the settings icon next to the bookmark toggle) to narrow that down further to specific bookmark colors — useful once you have several bookmark colors in play for different purposes (e.g. using distinct colors for grouping rows of interest)

Bookmark Filters dialog listing Annotations, Notes, and Color 1–10 with checkboxes, plus Select All / Deselect All

Toggle individual colors (or Annotations / Notes, the special bookmark categories) on or off, then OK to apply.

Annotation Bookmarks

Annotations are saved queries that are automatically applied as bookmarks whenever a matching log file is loaded — and optionally raise a watch/alert.

  1. Right-click a row → Annotate (or manage them via Settings → Annotations → Annotation Manager…).
  2. Give the annotation a description, and confirm or edit the Query Pattern (pre-filled from the row you right-clicked, e.g. Message LIKE '%Potential hang on request id=%').
  3. Optionally restrict it to files whose name contains a given string via Filename Filter.
  4. Optionally set Watch Severity (None, INFO, WARN, ERROR) to also raise a watch alert during tailing and on file open — leave it at None (annotation only) for a silent bookmark.
  5. Save.
Create Annotation dialog with description text area, Query Pattern, Filename Filter, and a Watch Severity dropdown

On every load, the application runs each matching annotation in the background and marks the matching rows. Annotation bookmarks are listed as their own category in the Bookmark Filters dialog, separate from the numbered color bookmarks.

Annotations only apply on load when Apply bookmark annotations on load is enabled in Settings → Annotations, and can optionally read/write from an external database instead of the internal store.

Live Tailing

  1. Click Tail (▶) in the viewer toolbar.
  2. New entries appear at the bottom as they arrive. The table auto-scrolls to the latest entry.
  3. Click anywhere in the table to pause auto-scroll; it resumes when you scroll back to the bottom.
  4. Click Tail again (■) to stop.

Log Analysis

Click the bar-chart icon (Analyze Currently Displayed Log Rows) in the viewer toolbar to generate a report over whatever is currently shown — the full file, or the result of your active filter and time range.

Log Analysis dialog: Summary tab with an error/warning frequency chart, a severity breakdown pie chart, and totals; Errors/Warnings/Frequency tabs; Redact sensitive data checkbox

At the bottom:

Reloading and Load Settings

Click Reload to re-read the source with its current pattern and settings, or click the gear icon (Log Settings) to change how it's loaded before reloading:

Load Settings dialog: File Type, Log Pattern, Source Timezone, Display Timezone, an Append non-matching lines checkbox, and Filter Annotations / Cancel / Reload buttons

Click Reload to apply the changes.


Comparing

Two tools answer "what's different?" without leaving the application: the Compare window for anything you paste or send to it (text, lists, timestamps), and Compare Rows for two rows of a log.

The Compare Window

Open it any of these ways:

There is one Compare window for the whole application. It isn't tied to the log view that opened it, so you can keep it beside your logs as a scratch tool and paste or send text into it from any window; opening it again just brings it to the front.

Paste into Left and Right — the result updates as you type. Swap exchanges the two sides and Clear empties both. Choose what kind of comparison you want with the Text / Lists / Time buttons:

Text

Compare window in Text mode: two pasted log excerpts above a side-by-side diff with removed lines in red, added lines in green and the changed characters highlighted

Lists

Compare window in Lists mode with Comma auto-picked: comma-separated order-ID lists with Only in Left, Only in Right and In both, different count columns below a 'Different' verdict

Answers "are these the same list, ignoring order?". Each side is split into items and compared as a whole, counting duplicates — a, a, b and a, b, b hold the same values but are different lists.

Split on chooses what separates the items: Lines (one item per line), Whitespace (any run of spaces, tabs or line breaks), one of the same delimiters offered for CSV patterns — Comma, Semicolon, Colon, Pipe, Tab — or type your own (any length, taken literally). With a delimiter, line breaks still separate items too, so a delimited list spread over several lines compares correctly.

Picked for you: the delimiter is chosen automatically — whichever CSV delimiter appears most in the two sides, if it clearly beats the others (otherwise Lines). Colons inside times of day such as 10:54 don't count, and Whitespace is never picked automatically. auto next to Split on shows it was picked for you; choose one yourself and it stays until you press Clear.

Time

Compare window in Time mode: three timestamps on each side and a table with each pair's difference and the gaps between consecutive timestamps

Paste one timestamp on each side to get the time between them (Right − Left), e.g. +2m 14.381s and the exact 134,381 ms. Paste several, one per line, and the table pairs them up line by line and also shows the gap between consecutive timestamps on each side — handy for latency questions.

To look at the gaps in a single list of times, paste it into Left only (or Right only): the table shows each timestamp and the gap before it, and the heading gives the count, the total span, the average gap and the largest gap with where it occurs.

Compare window in Time mode with only Left filled: five timestamps with the gap before each, and a heading with the span, average gap and the largest gap (+7.589s before #4)

Accepted formats include:

Timestamps without a timezone are read in your system timezone, or — when they were sent from a log viewer — in that viewer's display timezone. The result line says which zone was assumed.

Send to Compare

Right-click in a log viewer → Send to Compare → Left or Right puts the text into that side of the Compare window (opening it if needed) and leaves the other side as it is. It sends exactly what Copy would copy: text you've selected inside a cell, otherwise the selected cells or rows, otherwise the row you right-clicked. Several selected rows arrive one per line, ready for Lists mode.

Send Left from one viewer and Right from another to compare across windows — for example a merged view against one of its source logs.

Compare Rows

Select exactly two rows in a log viewer, right-click → Compare Rows. To select the two rows, click the first, then Ctrl+click the second (it can be anywhere in the view). If they're next to each other, you can also Shift+click or drag over the two. Any cells will do, as long as they're in exactly two rows; the menu item only appears then.

Compare Rows window: Swap at the top right, +2m 14.381s between the rows below it, and the timestamp, level, thread and message columns side by side with the changed characters highlighted

Selecting and Copying

All the compared text can be selected: drag to select, double-click for a word, triple-click for the whole value, then Ctrl+C. Right-click offers Copy, Select All and Copy All. In the Lists and Time tables, select rows and press Ctrl+C.


Log Patterns

A Log Pattern tells the application how to split each log line into structured columns. The correct pattern is essential for filtering, the time slider, and merging.

Auto-Detection

When you open a file, the application scans the first several hundred lines and tries every known pattern in order of specificity. If a pattern matches, it is selected automatically.

If auto-detection fails, the file is opened with the Catchall pattern, which loads every line as a single unstructured message column with no timestamp.

Built-in Pattern Types

Type Description Example source
Text / Log4j Regex-based; covers Log4j, Logback, and custom text formats app.log
CSV Delimiter-separated columns; first row is header access.log, exported data
JSON Newline-delimited JSON objects Structured logging, Fluentd
XML Element-per-entry XML Some application servers
Catchall One column per line, no parsing, no timestamp Any unknown format
Database Column layout discovered from the DB schema External DB tables
Kubernetes Kubernetes API log format kubectl logs output
SFTP Delegates to one of the above after download Remote servers

Pattern Editor

Open the Log Pattern Editor from Settings → Patterns → Log Pattern Editor…, or, in a log that loaded as a single Message column, right-click a row and choose Create Pattern from This Row... to start from that line.

  1. Load Existing Pattern to edit one, or start fresh by filling in Pattern Name, Pattern Type, and a Sample Log Line.
  2. Write (or generate — see Regex Pattern Generator) a Regex Pattern with capture groups.
  3. Set the Time Parse Format (Java DateTimeFormatter syntax), or click ISO for a standard ISO-8601 shortcut.
  4. Click Apply Regex to Sample to populate Column Mappings from the sample line, then adjust each column's Column Name, Column Type, and Column Size (see Column types and sizes).
  5. Save Pattern. Patterns can also be Imported / Exported as files to share between installs.
Log Pattern Editor with a loaded FILE pattern, its regex, ISO timestamp format, and a populated Column Mappings table

Example pattern for a typical Logback line:

^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\s+(\w+)\s+\[([^\]]+)\]\s+([\w.$]+)\s+-\s+(.*)$
Format string Matches
yyyy-MM-dd HH:mm:ss,SSS 2026-06-03 04:15:48,123
yyyy-MM-dd'T'HH:mm:ss.SSSXXX 2026-06-03T04:15:48.123+00:00
dd/MMM/yyyy:HH:mm:ss Z 03/Jun/2026:04:15:48 +0000 (Apache)
EEE MMM dd HH:mm:ss zzz yyyy Wed Jun 03 04:15:48 UTC 2026 (syslog)

Column types and sizes

Each row in Column Mappings sets how one captured value is stored and shown. Column Type controls what Klunk does with it:

Type Use it for
datetime The timestamp. Drives the time slider, time ordering, merging and Synch All. One per pattern.
level The severity (ERROR, WARN, INFO...). Colors the rows and counts errors and warnings. One per pattern.
number Numeric values such as durations, counts or status codes.
string Everything else.

Column Size sets how wide the column starts in the viewer. New columns start at MEDIUM; you can always drag column edges afterwards.

Size Typical column
EXTRA_SMALL, VERY_SMALL Short values: level, thread, a job or host id (about 10 characters at VERY_SMALL)
SMALL Class or component names (about 18 characters)
MEDIUM_SMALL Timestamps
MEDIUM, MEDIUM_LARGE URLs, paths, longer identifiers
LARGE, VERY_LARGE, EXTRA_LARGE Long text that isn't the main message
FILL Takes whatever width is left over. Give it to the message and keep that column last.

Regex Pattern Generator

Don't want to hand-write a regex? Click Generate Regex next to the sample line in the Pattern Editor.

  1. Working left to right along the Sample Log Line, select the portion you want as a capture group and click Add Selected as Group. Repeat for each field (timestamp, level, thread, message, …).
  2. Unselected text between groups is kept as Literal text the regex must match exactly.
  3. The Generated Regex Preview builds up live as you add groups.
  4. Click Apply to copy the generated regex back into the Pattern Editor's Regex Pattern field, then map each group to a column as usual.
Regex Pattern Generator with a sample log line, a Regex Components table, and a live Generated Regex Preview
Reset clears all selected groups and starts over from the plain sample line.

Changing a Pattern After Load

You can switch patterns on an already-loaded file without closing and re-opening it: click the gear icon in the viewer toolbar to open Load Settings, change Log Template, and click Reload.

Switching from Catchall (no timestamp) to a pattern with timestamps adds the timestamp column and enables the time slider.

Managing Datasources

Beyond the one-off Import dialog, connection details for databases, Kubernetes clusters, and SFTP servers can be saved as reusable datasources so you don't have to re-enter credentials each time. Manage them from Settings → Datasource: Database / Kubernetes / SFTP, or directly from the Import Data dialog's respective tab.

DB Datasource Editor — create, edit, test, and delete saved database connections (name, DB type, driver, host, port, database, username, password, or a raw JDBC URL). Passwords are stored encrypted unless Save password is unchecked.

DB Datasource Editor with connection fields and New / Save / Delete / Test Connection / Manage Drivers buttons

Click Manage Drivers to register a custom JDBC driver (name and main class) beyond the built-in ones:

Driver Editor listing registered JDBC drivers by Name and Main Class, with Add / Delete buttons

Kubernetes Datasource Editor — save a named cluster connection, either by pasting a kubeconfig directly or pointing at a config file on disk, then Test Connection before saving.

Kubernetes Datasource Editor with a Name field, Paste config / Config file radio buttons, and a Config text area

SFTP Datasource Editor — save host, port, username, and either a password or an SSH private-key path (with optional passphrase). If a default SSH key is configured in Settings → Datasource: SFTP, individual connections can rely on it instead of specifying their own key.

SFTP Datasource Editor with host/port/username/password fields and Private Key Path / Passphrase fields

Session Persistence

Klunk - Log Viewer can save your workspace when you close it and restore it on next launch — toggle Save Session on Close in the Log Manager toolbar.

What is saved per viewer:


Performance and Virtualization

Klunk - Log Viewer handles very large log files through adaptive storage: smaller logs are held fully in memory, and larger ones switch to SQLite-backed paging. The switch-over point is log.virtualization.threshold (default 50,000 rows).

Dataset size Mode Behaviour
Up to the threshold In-memory All rows held in RAM
Above the threshold SQLite-paged Pages fetched on demand; never switches back to in-memory

In SQLite-paged mode, filtering uses SQL WHERE clauses executed in SQLite — no memory overhead.

Tuning virtualization — raw properties editable under Settings → Advanced:

Property Effect
log.virtualization.threshold Row count above which SQLite paging is used (default 50,000). Set it to 0 to always page, even for small logs.
log.virtualization.pagesize Rows fetched per page in SQLite mode
log.tail.interval.seconds How often a tailed source is polled for new lines
log.file.check.enabled / log.file.check.interval.secs Whether — and how often — open files are checked for external changes (the reload indicator)

Raise the threshold if you have ample RAM and prefer the faster in-memory experience. Lower it if you see high memory usage with large files.


Application Settings

Open Settings from the Log Manager toolbar. It's a collapsible accordion — click a section header to expand it.

Application Settings accordion listing Appearance, Patterns, Datasource: SFTP, Datasource: Kubernetes, Datasource: Database, Annotations, General Settings, Redaction, and Advanced

Appearance

Setting Description
Font Settings… Opens the font-family / size picker for the log table
Row height pixels tweak Nudge row height by −8 to +8 px
Maximum height of rows with wrapped lines Cap on how tall a wrapped multi-line row can grow (-1 disables the cap)
Enable Dark Mode Toggle the Light/Dark theme

Patterns

Opens the Log Pattern Editor.

Datasource: SFTP / Kubernetes / Database

Each opens the corresponding datasource editor. The SFTP section also lets you Browse… to or Generate New… a default SSH private key used automatically by SFTP connections that don't specify their own.

Annotations

Setting Description
Annotation Manager… Create, edit, and delete annotation rules
Apply bookmark annotations on load Whether annotations are auto-applied when a matching file is opened
Use external database for annotations Store/read annotations from an external database instead of the internal SQLite store

General Settings

General Settings panel: working directory, external editor path, Force purge database on close, and Scroll to last row checkboxes
Setting Description
Working directory Default directory for log files and user data
External editor path Application used to open raw log files from the launch icon
Force purge database on close Applies when Save Session on Close is disabled — clears the internal database on exit instead of leaving it for next launch
Scroll to the last row when a log file/source is initially opened Jump straight to the newest entry on open

Redaction

Literal find/replace substitutions (case-insensitive) applied before pattern-based redaction when generating Log Analysis or Group Analysis reports — e.g. replacing a real company or hostname with a generic placeholder before pasting a report into an AI assistant.

Redaction panel with a Find text / Replace with table and Add / Remove buttons

Advanced

Directly edit raw configuration properties not exposed elsewhere in the UI — useful for the virtualization tuning properties and any watch.alert.* export settings. Some changes may require a restart.

Advanced settings: a Property/Value table showing log.file.check.enabled, log.file.check.interval.secs, log.virtualization.threshold, log.virtualization.pagesize, log.tail.interval.seconds, and watch.alert.* properties

Keyboard Shortcuts

Any Window

Shortcut Action
Ctrl+Shift+D Open the Compare window (or bring it to the front)

Log Manager

Shortcut Action
Ctrl+I Open the Import dialog
Ctrl+F Focus the window-search filter
Ctrl+W Close selected windows
Ctrl+M Merge selected windows
Ctrl+G Group selected windows
Ctrl+Shift+G Save a group's windows for later reloading
Ctrl+Alt+A Analyze a group

Log Viewer

Shortcut Action
Ctrl+F Open / focus Find bar
F3 Find next
Shift+F3 Find previous
Ctrl+Shift+L Clear the filter
Enter Open Row Detail for selected row
Ctrl+A Select all visible rows
Ctrl+C Copy selected rows to clipboard (tab-separated)
Ctrl+↑ Jump to previous bookmark
Ctrl+↓ Jump to next bookmark
↑ / ↓ Move selection one row
Page Up/Down Scroll one screen
Ctrl+E Export Log…
F5 Reload log from source

Troubleshooting

"No content available" after opening a file

The log pattern did not match any lines. Try:

  1. Click the gear icon (Log Settings) → change Log Pattern to a different pattern.
  2. If no built-in pattern fits, open the Pattern Editor and create a custom one.
  3. As a last resort, use the Catchall pattern — it loads every line as a raw message.

Time slider is not visible

The time slider only appears for patterns that include a timestamp column. Add a timestamp field in the Pattern Editor to enable it.

Filter returns no results for a valid timestamp

Both 2026-06-03T04:15:48Z and 2026-06-03T04:15:48.000Z are equivalent and both accepted. Display-format queries like 2026-06-03 - 04:15:48.000 also work.

Application is slow when scrolling a large file

"Parsing and inserting log entries" progress never clears

A background query (e.g. an annotation lookup) may be holding a read lock when the reload starts. The lock releases automatically. If it happens frequently, try disabling Apply bookmark annotations on load in Settings → Annotations while working with very large files.

Session does not restore a window

If a source file has moved or is unavailable at startup, that viewer is skipped during session restore. Re-open the file from its new location and the saved filters and bookmarks are picked up on the next close.

↑ Back to top